簡體   English   中英

Python多處理隊列失敗

[英]Python multiprocessing Queue failure

我創建了100個子進程

proc_list = [
    Process(target = simulator, args=(result_queue,))
    for i in xrange(100)]

並開始他們

for proc in proc_list: proc.start()

在進行一些處理之后,每個進程都會將result_queue(multiprocessing.Queue的實例)10000個元組放入其中。

def simulate(alg_instance, image_ids, gamma, results,
                     simulations, sim_semaphore):
  (rs, qs, t_us) =  alg_instance.simulate_multiple(image_ids, gamma,
                                             simulations)
  all_tuples = zip(rs, qs, t_us)
  for result in all_tuples:
    results.put(result)
  sim_semaphore.release()

我應該(?)在隊列中獲得1000000個元組,但經過各種運行后我得到這些(樣本)大小:14912 19563 12952 13524 7487 18350 15986 11928 14281 14282 7317

有什么建議?

我對多處理問題的解決方案幾乎總是使用Manager對象。 雖然暴露的接口是相同的,但底層實現更簡單,並且具有更少的錯誤。

from multiprocessing import Manager
manager = Manager()
result_queue = manager.Queue()

嘗試一下,看看它是否無法解決您的問題。

多處理.Queue在其文檔中被稱為線程安全的。 但是當您使用Queue進行進程間通信時,它應該與multiprocessing.Manager()一起使用.Queue()

OP帖子中沒有證據表明multiprocessing.Queue不起作用。 OP發布的代碼根本不足以理解正在發生的事情:他們是否加入了所有流程? 他們是否正確地將隊列傳遞給子進程(如果它在Windows上,則必須作為參數)? 他們的子進程是否驗證他們實際上有10000個元組? 等等

OP有可能在mp.Queue遇到難以重現的錯誤,但考慮到CPython已經完成的測試數量,以及我只是運行100個進程x 10000結果而沒有任何麻煩的事實,我懷疑OP實際上在他們自己的代碼中遇到了一些問題。

是的, Manager().Queue()在其他答案中提到的Manager().Queue()是一種非常好的共享數據的方式,但是沒有理由避免multiprocessing.Queue()基於未經證實的報告“它有問題”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM