我正在学习python-asyncio,我正在尝试编写一个简单的模型。
我有一个处理任务的函数。在处理过程中,它会转到另一个远程服务获取数据,然后打印一条消息。
我的代码:
dd = 0
@asyncio.coroutine
def slow_operation():
global dd
dd += 1
print('Future is started!', dd)
yield from asyncio.sleep(10 - dd) # request to another server
print('Future is done!', dd)
def add():
while True:
time.sleep(1)
asyncio.ensure_future(slow_operation(), loop=loop)
loop = asyncio.get_event_loop()
future = asyncio.Future()
asyncio.ensure_future(slow_operation(), loop=loop)
th.Thread(target=add).start()
loop.run_forever()但是,这段代码在睡觉时不会切换上下文:
yield from asyncio.sleep(10 - dd)我怎么才能解决呢?
发布于 2015-12-21 08:17:58
未来并不是线程安全的,这就是为什么slow_operation任务应该启动的原因。使用线程安全
callback = lambda: asyncio.ensure_future(slow_operation(), loop=loop)
loop.call_soon_threadsafe(cb)如果运行python3.5.1,也可以使用线程安全:
asyncio.run_coroutine_threadsafe(slow_operation(), loop)但是,您可能应该将线程的使用保持在最低限度。除非在自己的线程中使用运行任务的库,否则所有代码都应该在事件循环中运行(或者在执行器中运行,请参见遗嘱执行人)。
https://stackoverflow.com/questions/34385542
复制相似问题