当前位置: 首页 > 面试题库 >

有没有一种方法可以在多个线程中使用asyncio.Queue?

阎辰钊
2023-03-14
问题内容

假设我有以下代码:

import asyncio
import threading

queue = asyncio.Queue()

def threaded():
    import time
    while True:
        time.sleep(2)
        queue.put_nowait(time.time())
        print(queue.qsize())

@asyncio.coroutine
def async():
    while True:
        time = yield from queue.get()
        print(time)

loop = asyncio.get_event_loop()
asyncio.Task(async())
threading.Thread(target=threaded).start()
loop.run_forever()

这段代码的问题在于,async协程内部的循环永远不会完成第一次迭代,而queue大小会不断增加。

为什么会这样发生,我该怎么解决?

我无法摆脱单独的线程,因为在我的真实代码中,我使用了单独的线程与串行设备进行通信,而且我还没有找到使用的方法asyncio


问题答案:

asyncio.Queue 不是线程安全的,因此您不能直接在多个线程中直接使用它。相反,您可以使用janus,它是提供线程感知asyncio队列的第三方库:

import asyncio
import threading
import janus

def threaded(squeue):
    import time
    while True:
        time.sleep(2)
        squeue.put_nowait(time.time())
        print(squeue.qsize())

@asyncio.coroutine
def async(aqueue):
    while True:
        time = yield from aqueue.get()
        print(time)

loop = asyncio.get_event_loop()
queue = janus.Queue(loop=loop)
asyncio.Task(asyncio.ensure_future(queue.async_q))
threading.Thread(target=threaded, args=(queue.sync_q,)).start()
loop.run_forever()

还有aioprocessing(全披露:我写了它),它还提供了进程安全的队列(作为副作用,线程安全的队列),但是如果您不尝试使用,那就太过分了multiprocessing

编辑

正如在其他答案中指出的那样,对于简单的用例,您也可以使用loop.call_soon_threadsafe添加到队列中。



 类似资料:
  • 问题内容: 嗨,我想使用WMI类来查找应用程序和产品信息。但是问题是我想使用Java或任何脚本语言(如python,javascript或perl)。我听说过JWMI,这可能是一个选择。有人可以帮我吗??? 问题答案: JavaScript和Java不是一回事。 JavaScript Windows脚本宿主(WSH)下提供了JavaScript。有了它,访问WMI相当容易: jWMI(Java)

  • 我知道我可以在一个jar中编译多个xsd文件。我尝试过使用不同的名称空间,这只让我完成了一半的目标。通过这种方式,我可以解析正确的模式,但我希望这对将接收我解析的xmlBeans对象的用户是透明的。 他们不必知道系统上当前存在哪个版本的xml文件。我需要每个xsd版本都有一个超级类来实现这一点。 这可以用xmlBeans完成吗?

  • 问题内容: 我想在我的sails.js应用程序中用猫鼬代替吃水线。我正在寻找执行此操作的正确方法,但是我没有在文档中看到操作方法。谁能解释该怎么做? 问题答案: 通过.sailsrc定义替代 您可以通过在项目根目录中定义的配置覆盖来实现。基本上,您必须阻止当前标记为“ 钩子” 的整个“水线”初始化。在.sailsrc中: 您还必须禁用该挂钩- 这取决于挂钩。源中的相关行:v0.10,v0.9.8。

  • 我很想知道是否有一个等价物: 它生成与matplotlib图表相反的图形。

  • 我有一个文档,它包含一个数组,如下所示。这是第一份文件。 我需要在聚合框架中用nestedData数组中的_id查找(连接)到另一个集合。

  • 我只需要一个标题,味精和按钮警报对话框,但显示为底部工作表。 哪里有一种方法可以获得这个(没有自定义视图)?