【问题标题】:Multiprocessing Pool return results as available多处理池返回结果可用
【发布时间】:2015-10-20 16:55:24
【问题描述】:

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

所以我以前用 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'”处中断,它不会在我所有的工作完成之前中断。

我如何“轮询”我的线程并在结果进入时返回它们?

谢谢!

【问题讨论】:

  • 完全不清楚您在这里的实际意思。你在说什么结果?请提供更多详细信息。

标签: python dictionary multiprocessing pool


【解决方案1】:

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 2014-08-25
    • 2011-10-16
    相关资源
    最近更新 更多