亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python程序中的線程操作 concurrent模塊使用詳解

系統(tǒng) 1930 0

一、concurrent模塊的介紹

concurrent.futures 模塊提供了高度封裝的異步調(diào)用接口

ThreadPoolExecutor :線程池,提供異步調(diào)用

ProcessPoolExecutor :進(jìn)程池,提供異步調(diào)用

ProcessPoolExecutor ThreadPoolExecutor :兩者都實現(xiàn)相同的接口,該接口由抽象Executor類定義。

二、基本方法

submit(fn, *args, **kwargs) :異步提交任務(wù)

map(func, *iterables, timeout=None, chunksize=1) :取代for循環(huán)submit的操作

shutdown(wait=True) :相當(dāng)于進(jìn)程池的 pool.close()+pool.join() 操作

  • wait=True,等待池內(nèi)所有任務(wù)執(zhí)行完畢回收完資源后才繼續(xù)
  • wait=False,立即返回,并不會等待池內(nèi)的任務(wù)執(zhí)行完畢
  • 但不管wait參數(shù)為何值,整個程序都會等到所有任務(wù)執(zhí)行完畢
  • submit和map必須在shutdown之前

result(timeout=None) :取得結(jié)果

add_done_callback(fn) :回調(diào)函數(shù)

三、進(jìn)程池和線程池

池的功能:限制進(jìn)程數(shù)或線程數(shù).

什么時候限制: 當(dāng)并發(fā)的任務(wù)數(shù)量遠(yuǎn)遠(yuǎn)大于計算機所能承受的范圍,即無法一次性開啟過多的任務(wù)數(shù)量 我就應(yīng)該考慮去限制我進(jìn)程數(shù)或線程數(shù),從保證服務(wù)器不崩.

3.1 進(jìn)程池

            
from concurrent.futures import ProcessPoolExecutor
from multiprocessing import Process,current_process
import time
def task(i):
  print(f'{current_process().name} 在執(zhí)行任務(wù){(diào)i}')
  time.sleep(1)
if __name__ == '__main__':
  pool = ProcessPoolExecutor(4) # 進(jìn)程池里又4個進(jìn)程
  for i in range(20): # 20個任務(wù)
    pool.submit(task,i)# 進(jìn)程池里當(dāng)前執(zhí)行的任務(wù)i,池子里的4個進(jìn)程一次一次執(zhí)行任務(wù)
          

3.2 線程池

            
from concurrent.futures import ThreadPoolExecutor
from threading import Thread,currentThread
import time
def task(i):
  print(f'{currentThread().name} 在執(zhí)行任務(wù){(diào)i}')
  time.sleep(1)
if __name__ == '__main__':
  pool = ThreadPoolExecutor(4) # 進(jìn)程池里又4個線程
  for i in range(20): # 20個任務(wù)
    pool.submit(task,i)# 線程池里當(dāng)前執(zhí)行的任務(wù)i,池子里的4個線程一次一次執(zhí)行任務(wù)
          

四、Map的用法

            
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import os,time,random
def task(n):
  print('%s is runing' %os.getpid())
  time.sleep(random.randint(1,3))
  return n**2
if __name__ == '__main__':
  executor=ThreadPoolExecutor(max_workers=3)
  # for i in range(20):
  #   future=executor.submit(task,i)
  executor.map(task,range(1,21)) #map取代了for+submit
          

五、同步和異步

理解為提交任務(wù)的兩種方式

同步: 提交了一個任務(wù),必須等任務(wù)執(zhí)行完了(拿到返回值),才能執(zhí)行下一行代碼

異步: 提交了一個任務(wù),不要等執(zhí)行完了,可以直接執(zhí)行下一行代碼.

同步:相當(dāng)于執(zhí)行任務(wù)的串行執(zhí)行

異步

            
from concurrent.futures import ProcessPoolExecutor
from multiprocessing import Process,current_process
import time
n = 1
def task(i):
  global n
  print(f'{current_process().name} 在執(zhí)行任務(wù){(diào)i}')
  time.sleep(1)
  n += i
  return n
if __name__ == '__main__':
  pool = ProcessPoolExecutor(4) # 進(jìn)程池里又4個線程
  pool_lis = []
  for i in range(20): # 20個任務(wù)
    future = pool.submit(task,i)# 進(jìn)程池里當(dāng)前執(zhí)行的任務(wù)i,池子里的4個線程一次一次執(zhí)行任務(wù)
    # print(future.result()) # 這是在等待我執(zhí)行任務(wù)得到的結(jié)果,如果一直沒有結(jié)果,這里會導(dǎo)致我們所有任務(wù)編程了串行
                # 在這里就引出了下面的pool.shutdown()方法
    pool_lis.append(future)
  pool.shutdown(wait=True) # 關(guān)閉了池的入口,不允許在往里面添加任務(wù)了,會等帶所有的任務(wù)執(zhí)行完,結(jié)束阻塞
  for p in pool_lis:
    print(p.result())
  print(n)# 這里一開始肯定是拿到0的,因為我只是去告訴操作系統(tǒng)執(zhí)行子進(jìn)程的任務(wù),代碼依然會繼續(xù)往下執(zhí)行
  # 可以用join去解決,等待每一個進(jìn)程結(jié)束后,拿到他的結(jié)果
          

六、回調(diào)函數(shù)

            
import time
from threading import Thread,currentThread
from concurrent.futures import ThreadPoolExecutor
def task(i):
  print(f'{currentThread().name} 在執(zhí)行{i}')
  time.sleep(1)
  return i**2

# parse 就是一個回調(diào)函數(shù)
def parse(future):
  # 處理拿到的結(jié)果
  print(f'{currentThread().name} 結(jié)束了當(dāng)前任務(wù)')
  print(future.result())
if __name__ == '__main__':
  pool = ThreadPoolExecutor(4)
  for i in range(20):
    future = pool.submit(task,i)
    '''
    給當(dāng)前執(zhí)行的任務(wù)綁定了一個函數(shù),在當(dāng)前任務(wù)結(jié)束的時候就會觸發(fā)這個函數(shù)(稱之為回調(diào)函數(shù))
    會把future對象作為參數(shù)傳給函數(shù)
    注:這個稱為回調(diào)函數(shù),當(dāng)前任務(wù)處理結(jié)束了,就回來調(diào)parse這個函數(shù)
    '''
    future.add_done_callback(parse)
    # add_done_callback (parse) parse是一個回調(diào)函數(shù)
    # add_done_callback () 是對象的一個綁定方法,他的參數(shù)就是一個函數(shù)
          

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 天天干天天爽天天射 | 今天的恋爱未删减在线观看 | 亚洲精品中文字幕字幕 | 神马影院我不卡手机版 | 99精品欧美一区二区三区美图 | 国产网红在线 | 欧美一级片网址 | 一区二区三区不卡免费视频97 | 九九热视 | 快射视频网 | 国内久久 | 高清波多野结衣一区二区三区 | 欧美成人aa大片拍拍拍 | 男女啪啪猛烈免费网站 | 日本精品a在线 | 性夜影院爽黄a爽免费看网站 | 日韩www | 久久精品国产99久久3d动漫 | 成人午夜影院在线观看 | 国产永久在线 | 色婷婷精品大视频在线蜜桃视频 | 操天天操| 亚洲精品aⅴ一区二区三区 亚洲精品ccc | 国产人做人爱视频精品 | 日本欧美一区二区三区乱码 | 亚洲图片欧美日韩 | 国产3344永久在线观看视频 | 久久国产精品一区二区三区 | 国内精品区一区二区三 | 国产成年网站v片在线观看 国产成人 免费观看 | 亚洲精品国产自在久久出水 | 日韩字幕在线 | 亚洲高清在线观看 | 久久综合久久自在自线精品自 | 亚洲成年人免费网站 | 天天干夜夜操视频 | 狠狠色狠狠综合久久 | 国产精品视频在线免费观看 | 91国内精品久久久久免费影院 | 国产在线观看91 | 女人182毛片a级毛片 |