【问题标题】:Can I pass a method to apply_async or map in python multiprocessing?我可以在 python 多处理中将方法传递给 apply_async 或 map 吗?
【发布时间】:2017-04-21 09:56:20
【问题描述】:

我怎样才能使以下工作?重点是我想异步运行一个方法(而不是函数)。

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

这不打印任何内容。

【问题讨论】:

标签: python asynchronous multiprocessing threadpool


【解决方案1】:

问题似乎是由于multiprocessing 需要腌制self.f 而绑定的方法不可腌制。有一个关于如何解决问题的讨论here

apply_async 显然创建了一个异常,该异常被放入返回的未来中。这就是为什么没有打印任何内容。如果将来执行get,则会引发异常。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢@fankster。它确实有效。唯一的问题是,据我了解,ThreadPool 仍将使用一个“进程”(换句话说,将仅在一个核心上运行)。如果这不是问题,您的回答会有所帮助,但我想在多个内核上运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 2020-09-25
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    相关资源
    最近更新 更多