一个我还没能找到答案的非常简单的问题:
如果我想在自己的线程中运行异步事件循环,并让它将消息发送回主线程,它是否可以使用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服务器,但由于某些请求,让它与主线程通信。
发布于 2017-11-02 14:36:03
asyncio.Queue用于在单个事件循环内使用。队列不是循环间通信原语。
此外,您不应该启动多个并行循环,每个循环都在自己的线程中。它是反模式的(至少对于Python是这样的)。
https://stackoverflow.com/questions/47058400
复制相似问题