亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

計時多處理腳本

計時多處理腳本

MMTTMM 2021-12-29 10:51:14
在使用多處理模塊時,我偶然發現了一個奇怪的計時問題。考慮以下場景。我有這樣的功能:import multiprocessing as mpdef workerfunc(x):    # timehook 3    # something with x    # timehook 4def outer():    # do something    mygen = ... (some generator expression)    pool = mp.Pool(processes=8)    # time hook 1    result = [pool.apply(workerfunc, args=(x,)) for x in mygen]    # time hook 2if __name__ == '__main__':    outer()我正在利用時間模塊來隨意了解我的函數運行的時間。我成功地創建了 8 個獨立的進程,它們無誤地終止。工人完成的最長時間約為 130 毫秒(在時間鉤 3 和 4 之間測量)。我預計(因為它們并行運行)鉤子 1 和鉤子 2 之間的時間大致相同。令人驚訝的是,我得到了 600 毫秒的結果。我的機器有 32 個內核,應該能夠輕松處理這個問題。誰能給我一個提示,這種時間差異是從哪里來的?謝謝!
查看完整描述

2 回答

?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

由于您使用的是多處理而不是多線程,因此您的性能問題與 GIL(Python 的全局解釋器鎖)無關。


我找到了一個有趣的鏈接,用一個例子解釋了這一點,你可以在這個答案的底部找到它。


GIL 不會阻止進程在機器的不同處理器上運行。它只允許一個線程在解釋器中一次運行。


所以多處理而不是多線程將使您實現真正的并發。


讓我們通過一些基準測試來理解這一切,因為只有這樣才能讓您相信上面所說的。是的,這應該是學習的方式——體驗它而不是僅僅閱讀或理解它。因為如果你經歷過一些事情,再多的爭論也無法說服你接受相反的想法。


import random

from threading import Thread

from multiprocessing import Process

size = 10000000   # Number of random numbers to add to list

threads = 2 # Number of threads to create

my_list = []

for i in xrange(0,threads):

    my_list.append([])

def func(count, mylist):

    for i in range(count):

        mylist.append(random.random())

def multithreaded():

    jobs = []

    for i in xrange(0, threads):

        thread = Thread(target=func,args=(size,my_list[i]))

        jobs.append(thread)

    # Start the threads

    for j in jobs:

        j.start() 

    # Ensure all of the threads have finished

    for j in jobs:

        j.join()


def simple():

    for i in xrange(0, threads):

        func(size,my_list[i])


def multiprocessed():

    processes = []

    for i in xrange(0, threads):

        p = Process(target=func,args=(size,my_list[i]))

        processes.append(p)

    # Start the processes

    for p in processes:

        p.start()

    # Ensure all processes have finished execution

    for p in processes:

        p.join()

if __name__ == "__main__":

    multithreaded()

    #simple()

    #multiprocessed()

附加信息


在這里您可以找到此信息的來源和更詳細的技術說明(獎勵:其中還引用了 Guido Van Rossum :))


查看完整回答
反對 回復 2021-12-29
?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

您正在使用pool.apply哪個正在阻塞。pool.apply_async改為使用,然后函數調用將全部并行運行,并且每個調用都會AsyncResult立即返回一個對象。您可以使用此對象來檢查進程何時完成,然后也可以使用此對象檢索結果。


查看完整回答
反對 回復 2021-12-29
  • 2 回答
  • 0 關注
  • 250 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號