python学习第三十二节(进程间通信、进程池、协程)
生活随笔
收集整理的這篇文章主要介紹了
python学习第三十二节(进程间通信、进程池、协程)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
當(dāng)多線程創(chuàng)建完畢之后,start并沒有了立刻運行,依舊需要和其他線程搶CPU的資格,只是
時間很短。
進(jìn)程之間的通信分為兩種,queue和pipe
上面函數(shù)通過multiprocessing的queue來實現(xiàn)進(jìn)程間通信。
1 from multiprocessing import Pipe,Process 2 def foo(sk): 3 sk.send('hello world')#通過管道sk發(fā)送內(nèi)容 4 print(sk.recv())#打印接收到的內(nèi)容 5 if __name__ == '__main__': 6 sock,conn=Pipe()#定義一個管道的兩頭 7 p=Process(target=foo,args=(sock,))#由于上面已經(jīng)通過multiprocessing導(dǎo)入了Process, 8 # 所以這里直接就可以創(chuàng)建一個子進(jìn)程,并將sock(管道的一頭)作為參數(shù)給foo函數(shù) 9 p.start()#激活這個進(jìn)程 10 print(conn.recv())#打印接收到的內(nèi)容,conn是管道的另一頭 11 conn.send('hi son')#通過管道發(fā)送內(nèi)容上面代碼通過Pipe來實現(xiàn)兩個進(jìn)程間的通信。
1 from multiprocessing import Manager,Process 2 def foo(l,i):#收到參數(shù),l是Mlist,i是循環(huán)的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):#創(chuàng)建5個子進(jìn)程 10 p=Process(target=foo,args=(Mlist,i))#定義一個進(jìn)程,將Mlist和i作為參數(shù)傳到foo 11 p.start()#激活這個進(jìn)程,執(zhí)行foo函數(shù) 12 l.append(p)#將5個進(jìn)程添加到l這個列表 13 for i in l: 14 i.join()#循環(huán)這個列表,然后將每個進(jìn)程join 15 print(Mlist)#當(dāng)所有的子進(jìn)程都結(jié)束,運行主進(jìn)程上面代碼通過Manger實現(xiàn)子進(jìn)程間的通信。
?
協(xié)程
協(xié)程,又叫微線程,實際上就是單線程,通過python語法,或模塊來實現(xiàn)并發(fā)。
本質(zhì)上就是一個進(jìn)程一個線程。
上圖是用yield實現(xiàn)了一個兩個函數(shù)逇并發(fā)處理。
1 from greenlet import greenlet#導(dǎo)入這個模塊 2 def foo():#定義一個函數(shù) 3 print('ok1')#打印 4 gr2.switch()#將程序切換到下面一個函數(shù),按照名字切 5 print('ok3')#打印 6 gr2.switch()#將程序切換到下面一個函數(shù),按照名字切 7 def bar(): 8 print('ok2')#打印 9 gr1.switch()#切到上面foo函數(shù) 10 print('ok4') 11 gr1=greenlet(foo)#實例化這個函數(shù) 12 gr2=greenlet(bar) 13 gr1.switch()#在外面寫這個就執(zhí)行了這個函數(shù)通過greenlet模塊的switch來實現(xiàn)協(xié)程的切換,greenlet模塊需要手動去pycharm下載
1 import gevent#導(dǎo)入這個模塊 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 這個程序的運行過程是,先執(zhí)行foo函數(shù), 13 打印之后遇到了IO操作,然后自動切換到下一個函數(shù)執(zhí)行, 14 打印之后又遇到了IO操作,然后切回foo函數(shù)發(fā)現(xiàn)IO2秒還沒有結(jié)束, 15 然后又切到了bar函數(shù)發(fā)現(xiàn)IO結(jié)束,打印,再切回foo函數(shù)打印 16 '''上面代碼通過gevent模塊來實現(xiàn)寫成的IO期間自動切換實現(xiàn)并發(fā)的程序。
gevent需要從pycharm下載。
?
轉(zhuǎn)載于:https://www.cnblogs.com/ArmoredTitan/p/7212171.html
總結(jié)
以上是生活随笔為你收集整理的python学习第三十二节(进程间通信、进程池、协程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联通猫和路由器一体机怎么设置wifi 联
- 下一篇: Java面试基础知识(1)