在字典中管理异步协程
Manage asyncio coroutines in dict
我想在 dict 中管理一些协程,而 运行 一个主协程。
具体来说,我想启动无休止的协程,将它们的处理程序放在字典中,然后再次通过字典调用取消它们。在我的示例中,我想启动 4 个协程,它们将使用协程 doomsday
再次一一取消。我正在使用 Python 3.6.
import asyncio
import traceback
async def add_to_handler(node, func):
func_handler[node] = asyncio.ensure_future(func, loop=loop)
return
async def test_func1():
while True:
print("1 - HeNlO")
await asyncio.sleep(1)
async def test_func2():
while True:
print("2 - TestFunc2")
await asyncio.sleep(2)
async def test_func3():
while True:
print("3 - Tukan")
await asyncio.sleep(3)
async def test_func4():
while True:
print("4 - Do Coro!")
await asyncio.sleep(4)
async def doomsday():
# Cancel coroutine every 10 seconds
print("launch doomsday")
for i in range(len(func_handler)):
await asyncio.sleep(10)
print("start cancelling with {}".format(i))
func_handler[str(i + 1)].cancel()
return
async def main():
await add_to_handler("1", test_func1)
await add_to_handler("2", test_func2)
await add_to_handler("3", test_func3)
await add_to_handler("4", test_func4)
await doomsday()
while True:
print("z..z..Z..Z...Z")
print(func_handler)
await asyncio.sleep(5)
func_handler = {}
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main())
except KeyboardInterrupt:
print("stop loop")
loop.close()
我尝试使用 AbstractEventLoop 的 .call_later
方法而不是无休止的 while 循环,但它仍然不想工作,而且似乎我的协程被视为函数,但我不不知道为什么。我的错在哪里?
尝试更改此功能:
async def add_to_handler(node, func):
func_handler[node] = asyncio.ensure_future(func(), loop=loop)
return None
关注asyncio.ensure_future(func(),loop=loop)
我想在 dict 中管理一些协程,而 运行 一个主协程。
具体来说,我想启动无休止的协程,将它们的处理程序放在字典中,然后再次通过字典调用取消它们。在我的示例中,我想启动 4 个协程,它们将使用协程 doomsday
再次一一取消。我正在使用 Python 3.6.
import asyncio
import traceback
async def add_to_handler(node, func):
func_handler[node] = asyncio.ensure_future(func, loop=loop)
return
async def test_func1():
while True:
print("1 - HeNlO")
await asyncio.sleep(1)
async def test_func2():
while True:
print("2 - TestFunc2")
await asyncio.sleep(2)
async def test_func3():
while True:
print("3 - Tukan")
await asyncio.sleep(3)
async def test_func4():
while True:
print("4 - Do Coro!")
await asyncio.sleep(4)
async def doomsday():
# Cancel coroutine every 10 seconds
print("launch doomsday")
for i in range(len(func_handler)):
await asyncio.sleep(10)
print("start cancelling with {}".format(i))
func_handler[str(i + 1)].cancel()
return
async def main():
await add_to_handler("1", test_func1)
await add_to_handler("2", test_func2)
await add_to_handler("3", test_func3)
await add_to_handler("4", test_func4)
await doomsday()
while True:
print("z..z..Z..Z...Z")
print(func_handler)
await asyncio.sleep(5)
func_handler = {}
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main())
except KeyboardInterrupt:
print("stop loop")
loop.close()
我尝试使用 AbstractEventLoop 的 .call_later
方法而不是无休止的 while 循环,但它仍然不想工作,而且似乎我的协程被视为函数,但我不不知道为什么。我的错在哪里?
尝试更改此功能:
async def add_to_handler(node, func):
func_handler[node] = asyncio.ensure_future(func(), loop=loop)
return None
关注asyncio.ensure_future(func(),loop=loop)