日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python学习第三十二节(进程间通信、进程池、协程)

發布時間:2023/12/2 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python学习第三十二节(进程间通信、进程池、协程) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當多線程創建完畢之后,start并沒有了立刻運行,依舊需要和其他線程搶CPU的資格,只是
時間很短。
進程之間的通信分為兩種,queue和pipe

1 import multiprocessing 2 def foo(q): 3 q.put([1,'hello',True]) 4 if __name__=='__main__': 5 q=multiprocessing.Queue()#通過multiprocessing建立一個隊列 6 p=multiprocessing.Process(target=foo,args=(q,)) 7 #用multiprocessing在調用Process,建立一個子進程,定義函數名,將q作為參數傳到foo函數, 8 #foo函數就可以通過這個參數來與主進程做交互了。 9 p.start()#激活這個子進程 10 print(q.get())#主進程

上面函數通過multiprocessing的queue來實現進程間通信。

1 from multiprocessing import Pipe,Process 2 def foo(sk): 3 sk.send('hello world')#通過管道sk發送內容 4 print(sk.recv())#打印接收到的內容 5 if __name__ == '__main__': 6 sock,conn=Pipe()#定義一個管道的兩頭 7 p=Process(target=foo,args=(sock,))#由于上面已經通過multiprocessing導入了Process, 8 # 所以這里直接就可以創建一個子進程,并將sock(管道的一頭)作為參數給foo函數 9 p.start()#激活這個進程 10 print(conn.recv())#打印接收到的內容,conn是管道的另一頭 11 conn.send('hi son')#通過管道發送內容

上面代碼通過Pipe來實現兩個進程間的通信。

1 from multiprocessing import Manager,Process 2 def foo(l,i):#收到參數,l是Mlist,i是循環的i 3 l.append(i*i)#將i平方添加到Mlist 4 if __name__=='__main__': 5 manager=Manager() 6 Mlist=manager.list([11,22,33])#定義一個列表 7 8 l=[] 9 for i in range(5):#創建5個子進程 10 p=Process(target=foo,args=(Mlist,i))#定義一個進程,將Mlist和i作為參數傳到foo 11 p.start()#激活這個進程,執行foo函數 12 l.append(p)#將5個進程添加到l這個列表 13 for i in l: 14 i.join()#循環這個列表,然后將每個進程join 15 print(Mlist)#當所有的子進程都結束,運行主進程

上面代碼通過Manger實現子進程間的通信。

?

協程
協程,又叫微線程,實際上就是單線程,通過python語法,或模塊來實現并發。
本質上就是一個進程一個線程。

上圖是用yield實現了一個兩個函數逇并發處理。

1 from greenlet import greenlet#導入這個模塊 2 def foo():#定義一個函數 3 print('ok1')#打印 4 gr2.switch()#將程序切換到下面一個函數,按照名字切 5 print('ok3')#打印 6 gr2.switch()#將程序切換到下面一個函數,按照名字切 7 def bar(): 8 print('ok2')#打印 9 gr1.switch()#切到上面foo函數 10 print('ok4') 11 gr1=greenlet(foo)#實例化這個函數 12 gr2=greenlet(bar) 13 gr1.switch()#在外面寫這個就執行了這個函數

通過greenlet模塊的switch來實現協程的切換,greenlet模塊需要手動去pycharm下載

1 import gevent#導入這個模塊 2 def foo(): 3 print('running in foo') 4 gevent.sleep(2)#打印之后睡一秒,模擬io操作 5 print('switch to foo again') 6 def bar(): 7 print('switch to bar') 8 gevent.sleep(1)#打印之后睡一秒,模擬io操作 9 print('switch to bar again') 10 gevent.joinall([gevent.spawn(foo),gevent.spawn(bar)]) 11 ''' 12 這個程序的運行過程是,先執行foo函數, 13 打印之后遇到了IO操作,然后自動切換到下一個函數執行, 14 打印之后又遇到了IO操作,然后切回foo函數發現IO2秒還沒有結束, 15 然后又切到了bar函數發現IO結束,打印,再切回foo函數打印 16 '''

上面代碼通過gevent模塊來實現寫成的IO期間自動切換實現并發的程序。
gevent需要從pycharm下載。

?

轉載于:https://www.cnblogs.com/ArmoredTitan/p/7212171.html

總結

以上是生活随笔為你收集整理的python学习第三十二节(进程间通信、进程池、协程)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。