2015-10-20 70 views
0

我試圖實現多處理,並努力獲得我需要的地方。多處理池返回結果可用

因此,我之前已經使用Celery進行了多處理,所以我習慣於能夠將作業發送給工作人員,並在完成時進行輪詢,並且即使其他工作正在進行也可以獲得工作結果。我試圖將這與多處理相關聯。這裏是我到目前爲止,從我發現各個網站挖出來...

import urllib2 
import time 
from multiprocessing.dummy import Pool as ThreadPool 
import random 

def openurl(url): 
    time.sleep(random.randrange(1,10)) 
    print url 
    return urllib2.urlopen(url) 


urls = [ 
    'http://www.python.org', 
    'http://www.python.org/about/', 
    'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html', 
    'http://www.python.org/doc/', 
    'http://www.python.org/download/', 
    'http://www.python.org/getit/', 
    'http://www.python.org/community/', 
    'https://wiki.python.org/moin/', 
    'http://planet.python.org/', 
    'https://wiki.python.org/moin/LocalUserGroups', 
    'http://www.python.org/psf/', 
    'http://docs.python.org/devguide/', 
    'http://www.python.org/community/awards/' 
    # etc.. 
    ] 

pool = ThreadPool(20) 

results = pool.map(openurl, urls) 

pool.close() 
pool.join() 
print 'now what' 

所以,我踢了我的網址的OpenURL功能,但如果我在打破「打印‘現在該怎麼辦’」 ,直到我所有的工作都完成之後,它纔會破產。

如何「輪詢」我的線程並返回結果?

謝謝!

+0

根本不清楚你在這裏的含義。你在說什麼結果?請詳細說明。 – ajsp

回答

0

pool.map將可迭代元素分佈在工作者池中,並在所有工作都準備好時彙總結果。

而且,pool.closepool.join指示池等待所有任務完成。

如果您想在處理結果時處理,則必須使用pool.apply_async並使用回調。或者您可以收集pool.apply_async返回的AsyncResult對象,並遍歷它們以查看每個對象何時準備就緒,但整個邏輯將非常麻煩。

from multiprocessing.pool import ThreadPool 

pool = ThreadPool(20) 
tasks = [] 

def callback(result): 
    # handle the result of your function here 
    print result 

for url in urls: 
    pool.apply_async(openurl, args=[url], callback=callback) 

pool.close() 
pool.join()