2010-09-30 64 views
23

我正在使用python 2.7,並試圖在自己的進程中運行一些CPU繁重的任務。我希望能夠將消息發送回父進程,以通知其進程的當前狀態。多處理隊列似乎是完美的,但我無法弄清楚如何讓它工作。我可以在由Pool.imap調用的函數中使用多處理隊列嗎?

所以,這是我的基本工作例子,減去使用隊列。

import multiprocessing as mp 
import time 

def f(x): 
    return x*x 

def main(): 
    pool = mp.Pool() 
    results = pool.imap_unordered(f, range(1, 6)) 
    time.sleep(1) 

    print str(results.next()) 

    pool.close() 
    pool.join() 

if __name__ == '__main__': 
    main() 

我試圖通過隊列在幾個方面,他們得到了錯誤信息「RuntimeError:隊列對象只能進程之間通過繼承共享」。這是我根據我發現的早期答案嘗試的方法之一。 (我在嘗試使用Pool.map_async和Pool.imap同樣的問題)

import multiprocessing as mp 
import time 

def f(args): 
    x = args[0] 
    q = args[1] 
    q.put(str(x)) 
    time.sleep(0.1) 
    return x*x 

def main(): 
    q = mp.Queue() 
    pool = mp.Pool() 
    results = pool.imap_unordered(f, ([i, q] for i in range(1, 6))) 

    print str(q.get()) 

    pool.close() 
    pool.join() 

if __name__ == '__main__': 
    main() 

最後,0健身辦法(使它全球)不產生任何的消息,它只是鎖定。

import multiprocessing as mp 
import time 

q = mp.Queue() 

def f(x): 
    q.put(str(x)) 
    return x*x 

def main(): 
    pool = mp.Pool() 
    results = pool.imap_unordered(f, range(1, 6)) 
    time.sleep(1) 

    print q.get() 

    pool.close() 
    pool.join() 

if __name__ == '__main__': 
    main() 

我知道,它可能會與multiprocessing.Process直接和有其他庫來完成這個工作,但我不想從標準庫函數是一個偉大的配合,直到我退避三舍當然,這不僅僅是因爲我缺乏知識,使我無法利用它們。

謝謝。

+0

您是否考慮過使用jug:http://luispedro.org/software/jug? – luispedro 2011-03-31 19:34:09

回答

41

訣竅是將Queue作爲參數傳遞給初始值設定項。似乎適用於所有Pool調度方法。

import multiprocessing as mp 

def f(x): 
    f.q.put('Doing: ' + str(x)) 
    return x*x 

def f_init(q): 
    f.q = q 

def main(): 
    jobs = range(1,6) 

    q = mp.Queue() 
    p = mp.Pool(None, f_init, [q]) 
    results = p.imap(f, jobs) 
    p.close() 

    for i in range(len(jobs)): 
     print q.get() 
     print results.next() 

if __name__ == '__main__': 
    main() 
+3

''multiprocessing.Pool'的'initializer'和'initargs'參數的用途和有用性的非常好的演示! – 2012-01-22 20:27:22

+0

你能解釋一下,爲什麼它有效?當你做f.q = q時會發生什麼? – kepkin 2012-07-12 19:26:15

+2

@kepkin在Python中,每個函數都是一個對象(請參閱http://docs.python.org/reference/datamodel.html#the-standard-type-hierarchy Callable Types)。因此,f.q在函數對象f上設置一個名爲q的屬性。這只是一個快速輕量級的方式來保存隊列對象以備後用。 – Olson 2012-07-17 22:31:22

相關問題