2014-09-24 45 views
4

我無法粘貼我的代碼片段,所以我將解釋場景 1.我有大約50000股股票的清單,需要一些估價 2.這些股票在MultiProcess.Queue 3.我創建了多個進程,每個進程將從隊列中取一批50個並執行一些操作。 4.在主線程中,我有一個檢查,看起來像這樣Python進程沒有加入

anymore_to_process = True 

while anymore_to_process: 
    if (stock_queue.qsize() == 0): 
     anymore_to_process = False 

for jobs in stock_jobs: 
    jobs.join() 
  • 然而,這似乎並沒有當我處理50000點的記錄工作。如果我處理500只股票,這工作正常。
  • 我做錯了什麼?當我處理大量股票時,爲什麼這些流程沒有加入。

    我知道這是很難回答,沒有看我的代碼.....但如果你能給我一些指針,這將是非常有益的。

    +0

    您是否在啓動子進程之前將所有庫存加載到'Queue'中? – dano 2014-09-24 20:04:49

    +1

    我知道你正在創建'50000/50'(aka * 1000 *)進程嗎?如果是這樣,那不會很好。 – roippi 2014-09-24 20:05:46

    +0

    不......我只創建10個流程.....他們一次只需要50個流程。 – user2097496 2014-09-24 20:57:25

    回答

    2

    問題已解決 - 從@ dano提問。 我的確在寫入另一個阻塞進程的隊列。我把它拿出來,問題解決了。

    +7

    發生這種情況是因爲'Queue'在大量數據被推入時會在內部使用緩衝區。寫入「隊列」的進程無法退出,直到該緩衝區被刷新爲止,直到你開始從「隊列」中拉出所有東西,纔會發生這種情況。因此,因爲在從任何他們寫入的Queue對象中抽出任何東西之前,您試圖「加入」所有進程,所以無法退出,因此「join」掛起。你可以通過在進程調用'join'之前排除'Queue'來解決這個問題。 – dano 2014-09-25 16:16:48

    +1

    我有一個類似的問題,我正在使用一個隊列,以便子進程可以將結果報告回主進程,但是這個隊列在所有進程返回前都不會被清空,而這些不會因爲你所說的而退出。所以我使用隊列的'join'方法(另一個被子進程佔用的隊列)而不是進程'join'方法 - 但是沒有其他方法來刷新緩衝區嗎? – 2016-09-29 12:23:29