第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Python-信號(hào)量和線程池-semaphore ThreadPollExector

標(biāo)簽:
Python

信号量

  其实本质上是锁,Lock是单锁,信号量是指定多把锁,也就是说通过信号量指定多个数线程可以访问相同资源,一般情况下读操作可以有多个,但写操作同时只有一个

 

信号量模块  semaphore

  # 使用起来和普通锁没 什么区别,但这个是比锁更加粗粒度锁,锁的是线程

  # 在线程实例前加锁,把锁传递进线程,在线程结束时候释放锁

?

from threading import Thread, Semaphorefrom queue import Queue  def add(chan, sem_lock):    for i in range(10):        chan.put(i)    # 释放锁    sem_lock.release()  if __name__ == '__main__':    numbers = Queue()    # 申明信号量    sem_lock = Semaphore(4)    sem_lock.acquire()    # 把锁传递进线程    tasks = {Thread(target=add, args=(numbers, sem_lock), name="北门吹雪 %s" % i) for i in range(10)}    for task in tasks:        task.start()    for task in tasks:        task.join()    print(numbers.get())

  

线程池

  不仅仅是数量控制,可以获取线程状态、任务状态、线程返回值等信息

  线程池模块  ThreadPollExecutor

 

线程池使用过程

  1. 实例化线程池

  2. 提交任务,会有个返回对象,submit是不会堵塞,立即返回

  3. 让主线程等待线程执行完成

  4. 关闭线程池

 

获取状态信息  线程对象

  1. 判断是否执行完        .done()

  2. 获取任务执行结果,堵塞    .result()

  3. 取消任务            .cancle()

 

对多个线程列表获取结果  线程对象

  1. as_complated        获取已经执行完成的线程结果

?


def add(number, name):    sum = 0    for i in range(number):        sum += i    # 模拟个线程执行堵塞情况    time.sleep(random())    # 返回线程执行结果    return sum  if __name__ == '__main__':    thread_pool = ThreadPoolExecutor(max_workers=3)    print("北门吹雪:http://www.cnblogs.com/2bjiujiu/")    name = "北门吹雪"    tasks = {thread_pool.submit(add, randint(10, 20), name) for _ in range(20)}     # map方法和as_completed最大区别在于map变化的只是参数线程是同一个线程,而as_completed可以执行不同的线程任务    for data in thread_pool.map(add, {randint(10, 20) for _ in range(20)}):        print(data)

  2. map            直接返回线程执行结果,保持传递进去顺序

?


def add(number):    sum = 0    for i in range(number):        sum += i    # 模拟个线程执行堵塞情况    time.sleep(random())    # 返回线程执行结果    return sum  if __name__ == '__main__':    print("北门吹雪")    thread_pool = ThreadPoolExecutor(max_workers=3)    tasks = {thread_pool.submit(add, randint(10, 20)) for _ in range(20)}     # map方法和as_completed最大区别在于map变化的只是参数线程是同一个线程,而as_completed可以执行不同的线程任务    for data in thread_pool.map(add, {randint(10, 20) for _ in range(20)}):        print(data)

  3. wait          等待所有线程执行完成

?


from concurrent.futures import ThreadPoolExecutor, as_completed, waitfrom random import randint, randomimport time  def add(number):    sum = 0    for i in range(number):        sum += i    # 模拟个线程执行堵塞情况    time.sleep(random())    # 返回线程执行结果    return sum  if __name__ == '__main__':    thread_pool = ThreadPoolExecutor(max_workers=3)    tasks = {thread_pool.submit(add, randint(10, 20)) for _ in range(20)}    print("北门吹雪")    # 主线程等待所有子线程执行完,不需要结果    # wait(tasks)

?

1<span style='font-family: "Microsoft YaHei"'>北门吹雪:http://www.cnblogs.com/2bjiujiu/</span>

经验:

  1. 线程池和信号量在某种程度如允许执行的线程数效果上是一样,但线程池可以获取线程执行结果得到线程执行状态

  2. 使用线程池需要首先实例化,然后提交线程,返回线程对象,然后在主线程中选择获取结果或者不需要结果,也可以选择堵塞等待线程执行完或不等待线程执行完

  3. 获取线程执行结果,可以参照Go语言中CSP通信模式,个人觉得这是个非常好的解决方案,这样的线程池接口提交远比CSP通信来的复杂

?

1<span style='font-family: "Microsoft YaHei"'>北门吹雪:http://www.cnblogs.com/2bjiujiu/</span>

原文出处

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消