Python多進程Process和管道Pipe的使用方式
更新時間:2024年02月10日 09:35:35 作者:AllardZhao
這篇文章主要介紹了Python多進程Process和管道Pipe的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
如何使用多線程?
實際案例
由于python中全局解釋器鎖(GIL)的存在,在任意時刻只允許一個線程在解釋器中運行。
因此python的多線程不適合處理cpu密集型的任務(wù)。
想要處理cpu密集型的任務(wù),可以使用多進程模型。
解決方案
使用標準庫中multiprocessing.Process,它可以啟動子進程執(zhí)行任務(wù),操作接口,進程間通信,進程間同步等,都與Threading.Thread類似。
代碼演示
(1)進程簡單使用
# _*_ encoding:utf-8 _*_
from multiprocessing import Process
# 定義需要子進程執(zhí)行函數(shù)
def f(s):
print(s)
# 創(chuàng)建一個全局變量
x = 1
# 在f2函數(shù)內(nèi)部修改全局變量的值
def f2():
# 使用global聲明x,然后再修改成5
global x
x = 5
if __name__ == '__main__':
# 創(chuàng)建子進程執(zhí)行函數(shù)
p = Process(target=f, args=('hello',))
# 啟動子進程
p.start()
# 等待一個進程結(jié)束
p.join()
'''
和多線程不一樣的是多個進程之間他們使用的虛擬地址空間是獨立的。
'''
# 在本進程中調(diào)用f2,然后查看x發(fā)現(xiàn)變成了5
f2()
print(x)
# 將x再修改回去,啟動子進程修改
x = 1
p1 = Process(target=f2)
p1.start()
# 在主進程當中查看x是1還是5
print(x)
# 發(fā)現(xiàn)x=1,說明子進程和主進程他們看到的,x不是同一個x他們分別是獨立的
# 既然進程之間無法訪問彼此的地址空間,進程之間如何通信(2)Queue隊列和Pipe管道的簡單使用
# _*_ encoding:utf-8 _*_
from multiprocessing import set_start_method
# 導入進程、隊列和管道
from multiprocessing import Process, Queue, Pipe
# 注意Queue和queue.Queue并不是同一個對象
q = Queue()
q.put(1)
print(q.get())
def f(q1):
print('start')
# 等待主進程傳入一個值
print(q1.get())
print('end')
# Pipe會創(chuàng)建雙向的管道
c1, c2 = Pipe()
# 向管道的c1端傳入數(shù)據(jù),在c2端讀取出來
c1.send('abc')
print(c2.recv())
# c2端寫入的,從c1端讀取出來
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)建進程的方式:
fork為分支創(chuàng)建,spawn為分產(chǎn)創(chuàng)建。
'''
set_start_method('fork', True)
# ------------------------------
q2 = Queue()
# 啟動一個子進程直接運行
Process(target=f, args=(q2,)).start()
# 子進程阻塞到get,等待傳入一個值
q2.put(100)
# ------------------------------
c3, c4 = Pipe()
# 子進程會等待向管道寫
Process(target=f2, args=(c4,)).start()
# 從c3端寫入數(shù)據(jù),然后函數(shù)回返回回來,再在c3端讀取
c3.send(55)
print(c3.recv())總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python中處理表格數(shù)據(jù)的Tablib庫詳解
這篇文章主要介紹了Python中處理表格數(shù)據(jù)的Tablib庫詳解,Tablib 是一個 MIT 許可的格式不可知的表格數(shù)據(jù)集庫,用 Python 編寫,它允許您導入、導出和操作表格數(shù)據(jù)集,需要的朋友可以參考下2023-08-08
Python網(wǎng)絡(luò)爬蟲之獲取網(wǎng)絡(luò)數(shù)據(jù)
本文介紹了Python中用于獲取網(wǎng)絡(luò)數(shù)據(jù)的重要工具之一——Requests庫,詳細講解了Requests庫的基本使用方法、請求方法、請求頭、請求參數(shù)、Cookies、Session等內(nèi)容,并結(jié)合實例代碼展示了Requests庫的應(yīng)用場景2023-04-04

