Asyncio 在另一个任务中启动一个任务?
Asyncio start a task inside another task?
我正在尝试学习 asyncio 的用法,但遇到了障碍。
我想做什么?我正在尝试创建一些 workers
,一旦创建它们就会开始自己的 task
。因此,当 task3
正在创建和启动时,task1
应该已经在执行其任务。我通过在单个 coroutine
中使用循环来做到这一点,在每次迭代中创建并启动 worker
。
我面临的问题:当第一个工人完成任务时,其他工人就停下来不再继续。
这是我的代码:
import asyncio
class Worker:
def __init__(self, session_name):
self.name = session_name
self.messagelist = ['--------1', '--------2', '--------3', '--------4']
async def job(self):
for i, message in enumerate(self.messagelist):
print(f"### Worker {self.name} says {message}")
await asyncio.sleep(20)
class Testmanager:
def __init__(self):
self.workers_name = ['test0', 'test1', 'test2', 'test3', 'test4']
async def create_and_start_workers(self, loop):
for i, name in enumerate(self.workers_name):
worker = Worker(name)
print(f"# Created worker {worker.name}")
loop.create_task(worker.job())
print(f"## Started worker {worker.name}")
await asyncio.sleep(10)
def start(self):
loop = asyncio.get_event_loop()
loop.run_until_complete(self.create_and_start_workers(loop))
loop.close()
manager = Testmanager()
manager.start()
当 运行 最初它按预期工作,但过了一会儿我得到了很多:
Task was destroyed but it is pending!
task: <Task pending coro=<Worker.job() done, defined at PATH_REDACTED> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x0000026AF6315438>()]>>
我做错了什么?
感谢您的帮助。
What am i doing wrong?
您永远不会等待您为 运行 并行创建的任务。例如:
async def create_and_start_workers(self, loop):
tasks = []
for i, name in enumerate(self.workers_name):
worker = Worker(name)
print(f"# Created worker {worker.name}")
tasks.append(loop.create_task(worker.job()))
print(f"## Started worker {worker.name}")
await asyncio.sleep(10)
await asyncio.gather(*tasks)
我正在尝试学习 asyncio 的用法,但遇到了障碍。
我想做什么?我正在尝试创建一些 workers
,一旦创建它们就会开始自己的 task
。因此,当 task3
正在创建和启动时,task1
应该已经在执行其任务。我通过在单个 coroutine
中使用循环来做到这一点,在每次迭代中创建并启动 worker
。
我面临的问题:当第一个工人完成任务时,其他工人就停下来不再继续。
这是我的代码:
import asyncio
class Worker:
def __init__(self, session_name):
self.name = session_name
self.messagelist = ['--------1', '--------2', '--------3', '--------4']
async def job(self):
for i, message in enumerate(self.messagelist):
print(f"### Worker {self.name} says {message}")
await asyncio.sleep(20)
class Testmanager:
def __init__(self):
self.workers_name = ['test0', 'test1', 'test2', 'test3', 'test4']
async def create_and_start_workers(self, loop):
for i, name in enumerate(self.workers_name):
worker = Worker(name)
print(f"# Created worker {worker.name}")
loop.create_task(worker.job())
print(f"## Started worker {worker.name}")
await asyncio.sleep(10)
def start(self):
loop = asyncio.get_event_loop()
loop.run_until_complete(self.create_and_start_workers(loop))
loop.close()
manager = Testmanager()
manager.start()
当 运行 最初它按预期工作,但过了一会儿我得到了很多:
Task was destroyed but it is pending!
task: <Task pending coro=<Worker.job() done, defined at PATH_REDACTED> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x0000026AF6315438>()]>>
我做错了什么?
感谢您的帮助。
What am i doing wrong?
您永远不会等待您为 运行 并行创建的任务。例如:
async def create_and_start_workers(self, loop):
tasks = []
for i, name in enumerate(self.workers_name):
worker = Worker(name)
print(f"# Created worker {worker.name}")
tasks.append(loop.create_task(worker.job()))
print(f"## Started worker {worker.name}")
await asyncio.sleep(10)
await asyncio.gather(*tasks)