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

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

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

如何使用多線程?

實(shí)際案例

由于python中全局解釋器鎖(GIL)的存在,在任意時刻只允許一個線程在解釋器中運(yùn)行。

因此python的多線程不適合處理cpu密集型的任務(wù)。

想要處理cpu密集型的任務(wù),可以使用多進(jìn)程模型。

解決方案

使用標(biāo)準(zhǔn)庫中multiprocessing.Process,它可以啟動子進(jìn)程執(zhí)行任務(wù),操作接口,進(jìn)程間通信,進(jìn)程間同步等,都與Threading.Thread類似。

代碼演示

(1)進(jìn)程簡單使用

# _*_ encoding:utf-8 _*_
from multiprocessing import Process
 
 
# 定義需要子進(jìn)程執(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)建子進(jìn)程執(zhí)行函數(shù)
    p = Process(target=f, args=('hello',))
    # 啟動子進(jìn)程
    p.start()
    # 等待一個進(jìn)程結(jié)束
    p.join()
    '''
    和多線程不一樣的是多個進(jìn)程之間他們使用的虛擬地址空間是獨(dú)立的。
    '''
    # 在本進(jìn)程中調(diào)用f2,然后查看x發(fā)現(xiàn)變成了5
    f2()
    print(x)
    # 將x再修改回去,啟動子進(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不是同一個x他們分別是獨(dú)立的
    # 既然進(jìn)程之間無法訪問彼此的地址空間,進(jìn)程之間如何通信

(2)Queue隊(duì)列和Pipe管道的簡單使用

# _*_ encoding:utf-8 _*_
from multiprocessing import set_start_method
# 導(dǎo)入進(jìn)程、隊(duì)列和管道
from multiprocessing import Process, Queue, Pipe
 
# 注意Queue和queue.Queue并不是同一個對象
q = Queue()
q.put(1)
print(q.get())
 
 
def f(q1):
    print('start')
    # 等待主進(jìn)程傳入一個值
    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)建進(jìn)程的方式:
        fork為分支創(chuàng)建,spawn為分產(chǎn)創(chuàng)建。
    '''
    set_start_method('fork', True)
    # ------------------------------
    q2 = Queue()
    # 啟動一個子進(jìn)程直接運(yùn)行
    Process(target=f, args=(q2,)).start()
    # 子進(jìn)程阻塞到get,等待傳入一個值
    q2.put(100)
    # ------------------------------
    c3, c4 = Pipe()
    # 子進(jìn)程會等待向管道寫
    Process(target=f2, args=(c4,)).start()
    # 從c3端寫入數(shù)據(jù),然后函數(shù)回返回回來,再在c3端讀取
    c3.send(55)
    print(c3.recv())

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

新沂市| 井陉县| 临泉县| 内江市| 九江市| 湄潭县| 章丘市| 宣汉县| 临泽县| 板桥市| 汾阳市| 克山县| 呼玛县| 兴城市| 成武县| 滦平县| 三都| 祥云县| 广元市| 宝坻区| 杭锦后旗| 香河县| 尼玛县| 西藏| 滦南县| 大邑县| 察隅县| 建水县| 塔城市| 琼海市| 怀远县| 哈密市| 抚顺县| 富民县| 佛山市| 金湖县| 台中市| 盐源县| 临海市| 渭源县| 社会|