繁体   English   中英

多处理池返回结果可用

[英]Multiprocessing Pool return results as available

我正在尝试实现多处理并努力达到我需要的目标。

因此,在某些背景下,我之前曾使用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'

因此,我在URL上启动了openurl函数,但是如果我在“ print'now what”(打印“现在做什么”)处中断,则直到我完成所有作业后,该函数才在那里中断。

如何“轮询”线程并在线程输入结果时返回结果?

谢谢!

pool.map将可迭代元素分布在“工作池”上,并在所有准备就绪时汇总结果。

此外, pool.closepool.join指示Pool等待直到所有任务完成。

如果要处理结果,请使用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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM