【问题标题】:Should I use two asyncio event loops in one program?我应该在一个程序中使用两个异步事件循环吗?
【发布时间】:2014-12-04 09:39:59
【问题描述】:

我想使用 Python 3 asyncio 模块来创建服务器应用程序。 我使用主事件循环来监听网络,当接收到新数据时,它会进行一些计算并将结果发送给客户端。 “做一些计算”是否需要一个新的事件循环?还是可以使用主事件循环?

【问题讨论】:

  • 您是否在寻找类似生产者消费者模式的东西? en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem
  • 在这种情况下,您可以将生产者用作主循环中的进程,并且只需要一个循环。这取决于网络使用一台计算机有很多网络端口。

标签: python python-3.4 event-loop python-asyncio


【解决方案1】:

您可以在主事件循环中进行计算工作,但在发生这种情况时整个事件循环将被阻塞 - 无法处理其他请求,并且您在事件循环中运行的任何其他内容都将被阻塞。如果这不可接受,您可能希望使用BaseEventLoop.run_in_executor 在单独的进程中运行计算工作。这是一个非常简单的示例来演示它:

import time
import asyncio
from concurrent.futures import ProcessPoolExecutor

def cpu_bound_worker(x, y):
    print("in worker")
    time.sleep(3)
    return x +y

@asyncio.coroutine
def some_coroutine():
    yield from asyncio.sleep(1)
    print("done with coro")

@asyncio.coroutine
def main():
    loop = asyncio.get_event_loop()
    loop.set_default_executor(ProcessPoolExecutor())
    asyncio.async(some_coroutine())
    out = yield from loop.run_in_executor(None, cpu_bound_worker, 3, 4)
    print("got {}".format(out))

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

输出:

in worker
done with coro
got 7

cpu_bound_worker 在子进程中执行,事件循环会像等待任何其他非阻塞 I/O 操作一样等待结果,因此它不会阻塞其他协程运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-09
    • 2018-07-29
    • 2013-10-25
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多