task - Asyncio 在另一个任务中启动一个任务?

标签 task python-asyncio python-3.7

我正在尝试学习 asyncio 的用法,但遇到了障碍。

我想做什么?我正在尝试创建多个 workers一旦它们被创建,它们就会开始自己的 task .所以虽然task3正在创建和启动 task1应该已经在执行它的任务了。我是通过在单个 coroutine 中使用循环来实现的, 在每次迭代中 worker已创建并启动。

我面临的问题:当第一个 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)

关于task - Asyncio 在另一个任务中启动一个任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59366851/

相关文章:

python - 异步协程上的高阶函数

python aiohttp websockets 关闭浏览器选项卡处理

import - DLL加载失败: Python modules accessible through Spyder but import fail in cmd

task - 如何在Julia中杀死任务/协程?

c# - OnlyOnRanToCompletion 和 NotOnFaulted 之间的区别?

c# - GUI task.wait 与控制台或线程池的死锁

c# - WPF Dispatcher 线程卡住主窗口

python - 运行时错误: File descriptor 8 is used by transport

postgresql - psycopg2游标获取结果集的所有顺序

Python:从基本数据类继承的数据类,如何将值从基类升级到新类?