如何在运行中的异步循环中添加一个新的协同机制?即。已经在执行一组协同线的人。
我想,作为一种解决办法,我们可以等待现有的协同机制完成,然后初始化一个新的循环(使用附加的协同线)。但还有更好的方法吗?
发布于 2015-12-28 19:59:09
您可以使用create_task来调度新的协同任务:
import asyncio
async def cor1():
...
async def cor2():
...
async def main(loop):
await asyncio.sleep(0)
t1 = loop.create_task(cor1())
await cor2()
await t1
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
loop.close()发布于 2017-10-12 13:23:00
若要向已经运行的事件循环添加函数,可以使用:
asyncio.ensure_future(my_coro())
在我的例子中,我使用了多线程(threading)和asyncio,并希望在已经运行的事件循环中添加一个任务。对于处于相同情况的其他人,请确保显式地声明事件循环(因为在Thread中不存在事件循环)。即:
在全球范围内:
event_loop = asyncio.get_event_loop()然后,在你的Thread里面
asyncio.ensure_future(my_coro(), loop=event_loop)发布于 2015-12-30 08:21:44
您的问题非常接近于“如何向运行中的程序添加函数调用?”
确切地说,什么时候需要向事件循环添加新的协同线?
让我们看看一些例子。这里,以两个协同线启动事件循环的程序是并行的:
import asyncio
from random import randint
async def coro1():
res = randint(0,3)
await asyncio.sleep(res)
print('coro1 finished with output {}'.format(res))
return res
async def main():
await asyncio.gather(
coro1(),
coro1()
) # here we have two coroutines running parallely
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())输出:
coro1 finished with output 1
coro1 finished with output 2
[Finished in 2.2s]您可能需要添加一些协同器,以获取coro1的结果,并在它准备好后立即使用它?在这种情况下,只需创建等待coro1并使用它的返回值的协同:
import asyncio
from random import randint
async def coro1():
res = randint(0,3)
await asyncio.sleep(res)
print('coro1 finished with output {}'.format(res))
return res
async def coro2():
res = await coro1()
res = res * res
await asyncio.sleep(res)
print('coro2 finished with output {}'.format(res))
return res
async def main():
await asyncio.gather(
coro2(),
coro2()
) # here we have two coroutines running parallely
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())输出:
coro1 finished with output 1
coro2 finished with output 1
coro1 finished with output 3
coro2 finished with output 9
[Finished in 12.2s]将coroutines看作是具有特定语法的正则函数。您可以启动一些函数集来并行执行(通过asyncio.gather),您可以在第一次完成之后启动下一个函数,您可以创建调用其他函数的新函数。
https://stackoverflow.com/questions/34499400
复制相似问题