1. 程式人生 > >進程池/線程池/協程

進程池/線程池/協程

future lis 協程 pat 自動 等待 用戶態 cut install

導入進程池線程池模塊@@

from concurrent import ProcessPoolExecutor,ThreadPoolExecutor

同步提交,異步提交@@

from concurrent import ProcessPoolExecutor,ThreadPoolExecutor
import os
def foo(name):
print(‘進程%s,進程號為%s‘%(name,os.getpid()))
return os.getpid()

if __nmae__==‘__main__‘:
pool=ProcessPoolExecutor(5)
lis=[]
for i in range(10):
future=pool.submit(foo,i)#異步提交,提交完一個任務後,直接執行下一行代碼,我們可以把生成的future對象保存在一個列表中,等到進程池內所有任務運行完再用對象調用result方法獲得任務返回的結果
#res=pool.submit(foo,i).result()同步提交:提交完一個任務後,就在原地等任務的執行結果,拿到執行結果後,再執行下一行代碼,會導致任務是串行執行的
#print(res)
lis.append(future)
pool.shutdown(wait=True)#shutdown代表的是關閉進程池的入口,不讓新的任務往進程池裏提交,wait代表的是等待進程池內所有的任務執行完畢
for i in (lis):
print(i.result())

print(‘主進程‘)



回調函數@@

from concurrent.future import ProcessPoolExecutor,ThreadPoolExecutor

def foo(i):
print(‘第%s進程進來了‘%s)

return i**2

def get(future):

print(future*2)


if __name__==‘__main__‘:
pool=ProcessPoolExecutor(5)
for i in range(10):
future=pool.submit(foo,i)
future.add_done_callback(get)#進程中在任務執行完畢後get會自動觸發,獲得的參數是future,執行get函數的是主進程,而在線程中則是由空閑的線程來執行
pool.shutdown(wait=True)

print(‘zhu‘)

並發編程之協程@@

並發的本質:切換+保存狀態
cpu正在運行一個任務,會有兩種情況會切走取執行其他的任務,一種是該任務遇到阻塞,另一種情況是該任務的計算時間過長或者有其他級別更高的程序替代了他
協程的本質就是在一個單線程下,用戶自己控制一個任務遇到io就切換到其他任務去執行,切換的時候需要把之前的任務狀態保存下來,以便於重新運行此任務時,可以從暫停的位子繼續運行


協程介紹@@

協程是單線程下的並發,又稱為微線程,纖程,協程是一種用戶態的輕量級線程,由用戶自己控制調度

安裝gevent@@
pip3 install gevent

from gevent import monkey;monkey.patch_all#需要使用gevent模塊必須把這行代碼放在最前邊,用來檢測協程的阻塞狀態
from gevent import spawn#spawn相當於提交

import time

def foo(name):
print(‘%s is running‘%name)
time.sleep(2)
print(‘%s is down‘%name)


def var(name):
print(‘%s is running‘%name)
time.sleep(2)
print(‘%s is down‘%name)


g1=spawn(foo,‘egon‘)
g2=spawn(foo,‘lili‘)
g1.join()
g2.join()
print(‘zhu‘)






























進程池/線程池/協程