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端寫入的,從c1端讀取出來(lái)
c2.send('xyz')
print(c1.recv())
def f2(c):
# 從連接中讀取數(shù)據(jù),然后乘2再寫回去
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ì)等待向管道寫
Process(target=f2, args=(c4,)).start()
# 從c3端寫入數(shù)據(jù),然后函數(shù)回返回回來(lái),再在c3端讀取
c3.send(55)
print(c3.recv())總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python Diagrams庫(kù)以代碼形式生成云系統(tǒng)架構(gòu)圖實(shí)例詳解
這篇文章主要介紹了Python Diagrams庫(kù)以代碼形式生成云系統(tǒng)架構(gòu)圖實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
將python運(yùn)行結(jié)果保存至本地文件中的示例講解
今天小編就為大家分享一篇將python運(yùn)行結(jié)果保存至本地文件中的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
Python?實(shí)現(xiàn)一個(gè)全連接的神經(jīng)網(wǎng)絡(luò)
這篇文章主要介紹了Python?實(shí)現(xiàn)一個(gè)全連接的神經(jīng)網(wǎng)絡(luò),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06
Python中raise用法簡(jiǎn)單實(shí)例(超級(jí)詳細(xì),看了無(wú)師自通)
python中raise語(yǔ)句用于手動(dòng)觸發(fā)異常,通過(guò)raise語(yǔ)句可以在代碼中顯式地引發(fā)異常,從而使程序進(jìn)入異常處理流程,下面這篇文章主要給大家介紹了關(guān)于Python中raise用法的相關(guān)資料,需要的朋友可以參考下2024-03-03
Python打包成exe(windows)或者app(mac)實(shí)踐
文章主要介紹了使用pyinstaller將Python腳本打包成可執(zhí)行文件的步驟,包括在Windows和macOS上的操作方法,詳細(xì)解釋了命令參數(shù)的作用和使用方法2026-04-04
詳解Pycharm出現(xiàn)out of memory的終極解決方法
這篇文章主要介紹了詳解Pycharm出現(xiàn)out of memory的終極解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Python技法之簡(jiǎn)單遞歸下降Parser的實(shí)現(xiàn)方法
遞歸下降解析器可以用來(lái)實(shí)現(xiàn)非常復(fù)雜的解析,下面這篇文章主要給大家介紹了關(guān)于Python技法之簡(jiǎn)單遞歸下降Parser的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05

