Python多進(jìn)程Process和管道Pipe的使用方式
如何使用多線程?
實(shí)際案例
由于python中全局解釋器鎖(GIL)的存在,在任意時(shí)刻只允許一個(gè)線程在解釋器中運(yùn)行。
因此python的多線程不適合處理cpu密集型的任務(wù)。
想要處理cpu密集型的任務(wù),可以使用多進(jìn)程模型。
解決方案
使用標(biāo)準(zhǔn)庫(kù)中multiprocessing.Process,它可以啟動(dòng)子進(jìn)程執(zhí)行任務(wù),操作接口,進(jìn)程間通信,進(jìn)程間同步等,都與Threading.Thread類似。
代碼演示
(1)進(jìn)程簡(jiǎn)單使用
# _*_ encoding:utf-8 _*_ from multiprocessing import Process # 定義需要子進(jìn)程執(zhí)行函數(shù) def f(s): print(s) # 創(chuàng)建一個(gè)全局變量 x = 1 # 在f2函數(shù)內(nèi)部修改全局變量的值 def f2(): # 使用global聲明x,然后再修改成5 global x x = 5 if __name__ == '__main__': # 創(chuàng)建子進(jìn)程執(zhí)行函數(shù) p = Process(target=f, args=('hello',)) # 啟動(dòng)子進(jìn)程 p.start() # 等待一個(gè)進(jìn)程結(jié)束 p.join() ''' 和多線程不一樣的是多個(gè)進(jìn)程之間他們使用的虛擬地址空間是獨(dú)立的。 ''' # 在本進(jìn)程中調(diào)用f2,然后查看x發(fā)現(xiàn)變成了5 f2() print(x) # 將x再修改回去,啟動(dòng)子進(jìn)程修改 x = 1 p1 = Process(target=f2) p1.start() # 在主進(jìn)程當(dāng)中查看x是1還是5 print(x) # 發(fā)現(xiàn)x=1,說(shuō)明子進(jìn)程和主進(jìn)程他們看到的,x不是同一個(gè)x他們分別是獨(dú)立的 # 既然進(jìn)程之間無(wú)法訪問(wèn)彼此的地址空間,進(jìn)程之間如何通信
(2)Queue隊(duì)列和Pipe管道的簡(jiǎn)單使用
# _*_ encoding:utf-8 _*_ from multiprocessing import set_start_method # 導(dǎo)入進(jìn)程、隊(duì)列和管道 from multiprocessing import Process, Queue, Pipe # 注意Queue和queue.Queue并不是同一個(gè)對(duì)象 q = Queue() q.put(1) print(q.get()) def f(q1): print('start') # 等待主進(jìn)程傳入一個(gè)值 print(q1.get()) print('end') # Pipe會(huì)創(chuàng)建雙向的管道 c1, c2 = Pipe() # 向管道的c1端傳入數(shù)據(jù),在c2端讀取出來(lái) c1.send('abc') print(c2.recv()) # c2端寫(xiě)入的,從c1端讀取出來(lái) c2.send('xyz') print(c1.recv()) def f2(c): # 從連接中讀取數(shù)據(jù),然后乘2再寫(xiě)回去 c.send(c.recv() * 2) if __name__ == '__main__': ''' set_start_method為創(chuàng)建進(jìn)程的方式: fork為分支創(chuàng)建,spawn為分產(chǎn)創(chuàng)建。 ''' set_start_method('fork', True) # ------------------------------ q2 = Queue() # 啟動(dòng)一個(gè)子進(jìn)程直接運(yùn)行 Process(target=f, args=(q2,)).start() # 子進(jìn)程阻塞到get,等待傳入一個(gè)值 q2.put(100) # ------------------------------ c3, c4 = Pipe() # 子進(jìn)程會(huì)等待向管道寫(xiě) Process(target=f2, args=(c4,)).start() # 從c3端寫(xiě)入數(shù)據(jù),然后函數(shù)回返回回來(lái),再在c3端讀取 c3.send(55) print(c3.recv())
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python中處理表格數(shù)據(jù)的Tablib庫(kù)詳解
這篇文章主要介紹了Python中處理表格數(shù)據(jù)的Tablib庫(kù)詳解,Tablib 是一個(gè) MIT 許可的格式不可知的表格數(shù)據(jù)集庫(kù),用 Python 編寫(xiě),它允許您導(dǎo)入、導(dǎo)出和操作表格數(shù)據(jù)集,需要的朋友可以參考下2023-08-08python查找目錄下指定擴(kuò)展名的文件實(shí)例
這篇文章主要介紹了python查找目錄下指定擴(kuò)展名的文件,實(shí)例分析了Python文件查詢的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04Python簡(jiǎn)單爬蟲(chóng)導(dǎo)出CSV文件的實(shí)例講解
今天小編就為大家分享一篇Python簡(jiǎn)單爬蟲(chóng)導(dǎo)出CSV文件的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Python網(wǎng)絡(luò)爬蟲(chóng)之獲取網(wǎng)絡(luò)數(shù)據(jù)
本文介紹了Python中用于獲取網(wǎng)絡(luò)數(shù)據(jù)的重要工具之一——Requests庫(kù),詳細(xì)講解了Requests庫(kù)的基本使用方法、請(qǐng)求方法、請(qǐng)求頭、請(qǐng)求參數(shù)、Cookies、Session等內(nèi)容,并結(jié)合實(shí)例代碼展示了Requests庫(kù)的應(yīng)用場(chǎng)景2023-04-04python庫(kù)使用Fire庫(kù)生成命令行參數(shù)
Python Fire是一個(gè)開(kāi)源庫(kù),能把Python對(duì)象轉(zhuǎn)換為命令行界面,F(xiàn)ire庫(kù)是一個(gè)非常有用的工具,它可以幫助開(kāi)發(fā)人員創(chuàng)建命令行界面,并且可以將任何Python對(duì)象轉(zhuǎn)換為命令行界面,這篇文章主要介紹了python庫(kù)使用Fire庫(kù)生成命令行參數(shù),需要的朋友可以參考下2024-02-02Django實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Django實(shí)現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02