最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python多進(jìn)程Process和管道Pipe的使用方式

 更新時(shí)間:2024年02月10日 09:35:35   作者:AllardZhao  
這篇文章主要介紹了Python多進(jìn)程Process和管道Pipe的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

如何使用多線程?

實(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)文章

最新評(píng)論

潼关县| 锦州市| 如东县| 布尔津县| 阜新| 祁东县| 汝南县| 巩义市| 建宁县| 吉林省| 汪清县| 河间市| 西和县| 贺兰县| 巴南区| 信宜市| 苍南县| 通州区| 甘德县| 师宗县| 福建省| 嘉义县| 千阳县| 东海县| 琼结县| 枝江市| 富蕴县| 滨海县| 隆回县| 周宁县| 香港| 武功县| 嘉鱼县| 永寿县| 奈曼旗| 红河县| 莱西市| 崇州市| 同仁县| 准格尔旗| 焦作市|