Python多進(jìn)程Process和管道Pipe的使用方式
如何使用多線程?
實(shí)際案例
由于python中全局解釋器鎖(GIL)的存在,在任意時(shí)刻只允許一個(gè)線程在解釋器中運(yùn)行。
因此python的多線程不適合處理cpu密集型的任務(wù)。
想要處理cpu密集型的任務(wù),可以使用多進(jìn)程模型。
解決方案
使用標(biāo)準(zhǔn)庫中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,說明子進(jìn)程和主進(jìn)程他們看到的,x不是同一個(gè)x他們分別是獨(dú)立的
# 既然進(jì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端讀取出來
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)建進(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ù)回返回回來,再在c3端讀取
c3.send(55)
print(c3.recv())總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python中處理表格數(shù)據(jù)的Tablib庫詳解
這篇文章主要介紹了Python中處理表格數(shù)據(jù)的Tablib庫詳解,Tablib 是一個(gè) MIT 許可的格式不可知的表格數(shù)據(jù)集庫,用 Python 編寫,它允許您導(dǎo)入、導(dǎo)出和操作表格數(shù)據(jù)集,需要的朋友可以參考下2023-08-08
python查找目錄下指定擴(kuò)展名的文件實(shí)例
這篇文章主要介紹了python查找目錄下指定擴(kuò)展名的文件,實(shí)例分析了Python文件查詢的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
Python簡(jiǎn)單爬蟲導(dǎo)出CSV文件的實(shí)例講解
今天小編就為大家分享一篇Python簡(jiǎn)單爬蟲導(dǎo)出CSV文件的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Python網(wǎng)絡(luò)爬蟲之獲取網(wǎng)絡(luò)數(shù)據(jù)
本文介紹了Python中用于獲取網(wǎng)絡(luò)數(shù)據(jù)的重要工具之一——Requests庫,詳細(xì)講解了Requests庫的基本使用方法、請(qǐng)求方法、請(qǐng)求頭、請(qǐng)求參數(shù)、Cookies、Session等內(nèi)容,并結(jié)合實(shí)例代碼展示了Requests庫的應(yīng)用場(chǎng)景2023-04-04
Django實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Django實(shí)現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02

