Python 如何在多个线程之间共享asyncio.Queue?
这个问题不同于其他问题 我有两个异步IO事件循环运行在两个不同的线程中。 Thread1通过异步IO.Queue()向Thread2生成数据 其中一个线程引发异常:Python 如何在多个线程之间共享asyncio.Queue?,python,multithreading,python-asyncio,Python,Multithreading,Python Asyncio,这个问题不同于其他问题 我有两个异步IO事件循环运行在两个不同的线程中。 Thread1通过异步IO.Queue()向Thread2生成数据 其中一个线程引发异常:get Future附加到另一个循环 这是真的,因为我在不同的循环中使用一个队列如何在两个不同线程中的两个循环之间共享队列? 示例代码: q = asyncio.Queue() async def producer(q): await asyncio.sleep(3) q.put(1) def prod_work(
get Future附加到另一个循环
这是真的,因为我在不同的循环中使用一个队列如何在两个不同线程中的两个循环之间共享队列?
示例代码:
q = asyncio.Queue()
async def producer(q):
await asyncio.sleep(3)
q.put(1)
def prod_work(q):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(producer(q))
async def consumer(q):
await asyncio.sleep(3)
res = await q.get()
def cons_work(q):
loop2 = asyncio.new_event_loop()
asyncio.set_event_loop(loop2)
loop2.run_until_complete(consumer(q))
def worker(q):
# main thread - uses this threads loop
prod = threading.Thread(target=prod_work, args=(q,))
# separate thread - uses NEW loop
cons = threading.Thread(target=cons_work, args=(q,))
prod.start()
cons.start()
worker(q)
完整堆栈跟踪:
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner
self.run()
File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "asyncio_examples.py", line 24, in cons_work
loop2.run_until_complete(consumer(q))
File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 568, in run_until_complete
return future.result()
File "asyncio_examples.py", line 18, in consumer
res = await q.get()
File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/queues.py", line 159, in get
await getter
RuntimeError: Task <Task pending coro=<consumer() running at asyncio_examples.py:18> cb=[_run_until_complete_cb() at /usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py:150]> got Future <Future pending> attached to a different loop
线程2中的异常:
回溯(最近一次呼叫最后一次):
文件“/usr/local/ceral/python/3.7.0/Frameworks/python.framework/Versions/3.7/lib/python3.7/threading.py”,第917行,在bootstrap\u-inner中
self.run()
文件“/usr/local/ceral/python/3.7.0/Frameworks/python.framework/Versions/3.7/lib/python3.7/threading.py”,第865行,正在运行
自我目标(*自我参数,**自我参数)
文件“asyncio_examples.py”,第24行,在cons_work中
循环2.运行_直到_完成(耗电元件(q))
文件“/usr/local/cillar/python/3.7.0/Frameworks/python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py”,第568行,运行_直到完成
返回future.result()
文件“asyncio_examples.py”,第18行,消费者
res=等待q.get()
文件“/usr/local/ceral/python/3.7.0/Frameworks/python.framework/Versions/3.7/lib/python3.7/asyncio/queues.py”,get中第159行
等待获得者
RuntimeError:任务已附加到其他循环
为什么两个事件循环同时运行?这样的设置可以工作,但asyncio并不是为支持它而设计的(也不是必需的),所以您正在向上游划船以使其工作;它是infra的一部分。我的主线程从该线程获取消息,并对其进行处理,然后将一些任务分派回另一个线程。惯用的方法是在单独的线程中运行事件循环,并使用
run\u coroutine\u threadsafe
向其提交协程。有关详细信息,请参见例如。