我想做的事情:
- 创建一个asyncio事件循环
- 将该循环传递给系统中的各个类以安排协程
- 该循环还用于处理事件的响应(例如,我有一个队列,某些事件处理代码会将项目放在该队列上,并且等待该队列的get()来处理这些值的单独的协程)
- 有一个主线程“拥有”该循环,负责创建循环,并在系统关闭时取消循环上运行的所有任务,并停止循环(干净的关闭)
我的理解是由于第3点,需要有东西在循环上调用run_forever()
,以确保任务可以安排在循环上。但是如果我调用run_forever()
,那么我的主线程会阻塞,永远不会终止。
我的尝试:
生成一个线程,传入循环,然后在线程中调用run_forever
。这意味着我的单元测试永远无法完成。要点如下:
def __start_background_loop(loop):
def run_forever(loop):
loop.run_forever()
# because run_forever() will block the current thread, we spawn
# a subthread to issue that call in.
thread = Thread(target=run_forever, args=(loop,))
thread.start()
def __end_background_loop(loop):
for task in Task.all_tasks(loop):
task.cancel()
loop.stop()
asyncio.new_event_loop()
- Zach Gates