【问题标题】:Async multiprocessing python异步多处理 python
【发布时间】:2017-08-10 01:42:11
【问题描述】:

所以我已经阅读了这篇关于 python 中的异步线程的好文章。艰难,最后一个在GIL 上有些问题,而且线程并不像看起来那么有效。

幸运的是,python 结合了 Multiprocessing,旨在不受此问题的影响。

我想了解如何以异步方式实现多处理队列(为每个进程打开管道),这样它就不会挂起正在运行的 async webserver

我已经阅读了这个topic,但是我不是在寻找性能,而是在排除一个让我的网络服务器挂起的大计算。这些计算需要图片,因此它们可能会进行大量的 i/o 交换,但据我了解,这可以通过 async 很好地处理。

所有的计算都是相互独立的,所以它们不能混合在一起。

我正在尝试在 ws 处理程序之前构建它。

如果您在此暗示异端,也请告诉我:)

【问题讨论】:

标签: python multithreading asynchronous


【解决方案1】:

这是在#python irc 上的某个好人向我暗示异步执行器后重新获取的一篇文章,以及 reddit 上的另一个答案:

(2) 使用 ProcessPoolExecutor “ProcessPoolExecutor 类是一个 Executor 子类,它使用进程池来异步执行调用。 ProcessPoolExecutor 使用多处理模块,这允许它绕过全局解释器锁,但也意味着只能执行和返回可提取的对象。”

import asyncio
from concurrent.futures import ProcessPoolExecutor

def cpu_heavy(num):
    print('entering cpu_heavy', num)
    import time
    time.sleep(10)
    print('leaving cpu_heavy', num)
    return num

async def main(loop):
    print('entering main')
    executor = ProcessPoolExecutor(max_workers=3)
    data = await asyncio.gather(*(loop.run_in_executor(executor, cpu_heavy, num) 
                                  for num in range(3)))
    print('got result', data)
    print('leaving main')


loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))

这是来自 reddit 上的另一个好人 ;)

【讨论】:

  • 我还想指出这个问题,它可能会更好地表述并包含答案的另一个“版本”。 stackoverflow.com/questions/27290656/… ;不同之处在于一个产卵一次只产生一个进程,而另一个产生一堆。因此,根据您的需要,您可能想单独使用 run_in_executor,或者如果您想拆分计算,我想您也会使用 asyncio.gather
  • g e n i u s。简直是天才。
  • 请注意,您需要在if __name__ == '__main__': 子句中运行最后两行,否则您生成的进程也会尝试启动进程,从而导致concurrent.futures.process.BrokenProcessPool 错误。
猜你喜欢
  • 2018-12-11
  • 2022-10-14
  • 2016-11-06
  • 2022-07-07
  • 2019-07-31
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多