【发布时间】:2018-04-13 23:30:48
【问题描述】:
一个非常简单的问题,我无法找到答案:
如果我想在自己的线程中运行 asyncio 事件循环,并将消息发送回主线程,它可以使用 queue.Queue 实例吗?
如果这确实可行且安全,是否有更好的方法将消息从非主线程中的异步循环传递到主线程?
这是一个玩具示例,似乎可行:
import asyncio
from queue import Queue
import threading
queue_to_main = Queue()
async def coro1():
for i in range(5):
queue_to_main.put_nowait(i)
await asyncio.sleep(1)
queue_to_main.put_nowait("STOP")
def runloop():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
loop.run_until_complete(coro1())
finally:
loop.close()
t1 = threading.Thread(target=runloop)
t1.start()
while True:
item = queue_to_main.get()
if item == "STOP":
break
print(item)
t1.join()
我设想的场景是在它自己的线程中运行一个 aiohttp 服务器,但由于某些请求而让其与主线程通信。
【问题讨论】:
-
您是否特别想避免使用
asyncio.Queue? -
不是特别 - 如果在这种情况下最终成为最好的做事方式,我会很乐意使用它。但是,我想从主线程中的
asyncio.Queue实例获取项目会有些复杂,因为asyncio.Queue不是线程安全的?我想您可能需要执行以下操作:item = asyncio.run_coroutine_threadsafe(my_aio_queue.get(), loop).result()? -
相关:janus
标签: python multithreading thread-safety python-3.5 python-asyncio