【问题标题】:Does starting threads from asyncio is wrong?从 asyncio 启动线程是错误的吗?
【发布时间】:2018-09-03 05:24:49
【问题描述】:

asyncio 中从loop.run_forever() 开始线程好吗?这是一个好习惯吗?

我也在asyncio 中使用线程池,单独使用asyncio 无法获得良好的速度,这就是我使用线程池的原因。

即使loop.run_forever() 继续永远运行,线程池执行后内存是否也会释放?

【问题讨论】:

  • 只要不违反规则,您可以从 asyncio 启动线程,例如“不要从运行事件循环的线程以外的线程与 asyncio 交互”。一般来说,您不应该需要启动线程,而是使用run_in_executor 之类的工具。

标签: python-3.x threadpool python-asyncio


【解决方案1】:

asyncio 代码开始一个新线程不是错误,而是非常无用的操作。

  1. 您应该控制已经分叉的线程数。这很重要,因为保持一千个并行线程运行通常是程序设计出现问题的标志。
  2. 您通常需要将在线程中执行的计算结果返回到异步代码中。
  3. 在程序终止时关闭所有活动线程听起来很明智,不是吗?

内置 asyncio loop.run_in_executor() 与标准线程池实现公司 (concurrent.futures.ThreadPoolExecutor) 以非常优雅的方式解决所有问题,请使用它。

【讨论】:

  • 是的,我在 loop.runforever 中使用 concurrent.futures.ThreadPoolExecutor 是一个好方法吗?
  • 如果您将loop.run_in_executor() 与您的自定义执行程序实例一起使用——您是正确的。显式调用执行器方法是 API 滥用的标志。
  • 但它并没有提供很好的速度,但是一次 50 个线程可以提供更快的速度,并且可以通过 ThreadPoolExecutor 实现
  • 对不起,我不关注。是什么阻止将您的自定义 ThreadPoolExecutor(max_size=50) 作为第一个参数传递给 loop.run_in_executor
  • 我在 loop.runforever() 中使用这个,并带有 concurrent.futures.ProcessPoolExecutor(50) 作为执行器:"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
相关资源
最近更新 更多