我可以在python多处理中将方法传递给apply_async或map吗?

时间:2016-12-06 16:59:03

标签: python asynchronous multiprocessing threadpool

如何让以下工作?重点是我想异步运行一个方法(而不是一个函数)。

from multiprocessing import Pool

class Async:
    def __init__(self, pool):
        self.pool = pool
        self.run()

    def run(self):
        p.apply_async(self.f, (10, ))

    def f(self, x):
        print x*x

if __name__ == '__main__':
    p = Pool(5)
    a = Async(p)
    p.close()
    p.join()

这不会打印任何内容。

2 个答案:

答案 0 :(得分:1)

问题似乎是由于multiprocessing需要挑选self.f而绑定方法不可选择这一事实。讨论了如何解决问题here

apply_async显然会创建一个异常,将在未来返回。这就是为什么没有印刷的原因。如果将来执行get,则会引发异常。

答案 1 :(得分:0)

它绝对有可能在python 2中使用线程池来线程类方法 - 以下程序完成了我所期望的。

#!/usr/bin/env python

from multiprocessing.pool import ThreadPool

class TestAsync():
  def __init__(self):
    pool = ThreadPool(processes = 2)

    async_completions = []
    for a in range(2):
      async_completions.append(pool.apply_async(self.print_int, (  a,)))

    for completion in async_completions:
      res = completion.get()
      print("res = %d" % res)

  def print_int(self, value):
    print(value)
    return (value*10)


a = TestAsync()