假设我有以下代码:
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查找(连接)到另一个集合。
我只需要一个标题,味精和按钮警报对话框,但显示为底部工作表。 哪里有一种方法可以获得这个(没有自定义视图)?