2015-08-13 37 views
0

我試圖在Python中使用多處理功能,讓一個函數在循環中繼續調用,隨後從函數中訪問最新的返回值(通過將值存儲在LIFO隊列中) 。使用(LIFO)隊列的Python多重處理

這裏是主程序

q = Queue.LifoQueue() 
while True: 
    p = multiprocessing.Process(target=myFunc, args = (q)) 
    p.daemon = True 
    p.start() 
    if not q.empty(): 
     #do something with q.get() 

的代碼片段下面是從myFunc的

def myFunc(q): 
    x = calc() 
    q.put(x) 

的問題是一個代碼段,主循環認爲q是空的。但是,我已經檢查myFunc()是否將值放入q中(通過在q.put(x)之後放置q.empty()檢查),並且隊列不應該爲空。

我該怎麼做,以便主循環可以看到隊列中的值?或者我以低效的方式解決這個問題? (我確實需要myFunc和主循環,因爲myFunc有點慢,主循環需要繼續執行它的任務)

回答

1

Queue.LifoQueueQueue.LifoQueue不適合多處理,只有multiprocessing.Queue是,at is it專門爲此用例設計的。這意味着輸入Queue.LifoQueue的值只能用於本地進程,因爲隊列不在子進程之間共享。

可能會使用來自SyncManager(SyncManager.list())的共享列表。當僅與appendpop一起使用時,列表的行爲就像一個lifo隊列。

+0

謝謝!我將試用SyncManager.list()並查看它是否有效。你認爲我想要做什麼,多處理是最好的方法嗎? – user3543300