为什么 python asyncio 代码卡在第一个并发任务上?

Why python asyncio code stucks on the first concurrent task?

在asyncio的学习和测试中,我写了下面的代码,有3个并发任务。

import asyncio
from time import time

tasks_to_schedule = []
task_queue = []

class Test():
    def __init__(self, task_name, repeat_every):
        self.name = task_name
        self.repeat_every = repeat_every
        self.scheduled = 0

    def schedule(self, t_now):
        self.scheduled = t_now

    async def run(self):
        print(f'It is {self.name}')
        print(f'{self.name} running...')
        await asyncio.sleep(2)
        print(f'{self.name} finished')

    def check_result(self):
        pass

    async def report(self):
        print(f'{self.name} report DONE')
        await asyncio.sleep(1)

def prepare_tasks():
    task_a = Test('Task A', 2)
    task_b = Test('Task B', 4)
    tasks_to_schedule.append(task_a)
    tasks_to_schedule.append(task_b)

async def scheduler():
    turn = 0
    while turn < 5:
        if tasks_to_schedule:
            print(f'***\t Turn {turn} \t***')
            task = tasks_to_schedule.pop(0)
            if task.scheduled < time():
                task_queue.append(task)
                print(f'adding task {task.name} to queue,\n queue size = {len(task_queue)}')
                turn += 1
            else:
                tasks_to_schedule.append(task)
        await asyncio.sleep(1)

async def worker(name):
    while True:
        if task_queue:
            task = task_queue.pop(0)
            print(f'Worker {name} - took task {task.name}')
            await task.run()
            await task.report()
            print(f'Worker {name} - task {task.name} completed, reschedule it')
            task.schedule(time())
            tasks_to_schedule.append(task)
        # await asyncio.sleep(1)       #Process stuck without this line

async def main():
    task_scheduler = asyncio.create_task(scheduler())
    worker1 = asyncio.create_task(worker(1))
    worker2 = asyncio.create_task(worker(2))
    await asyncio.gather(task_scheduler, worker1, worker2)

if __name__ == '__main__':
    prepare_tasks()
    asyncio.run(main())

“任务A 运行宁...”后进程卡住的问题,唯一的输出是:

***      Turn 0         ***
adding task Task A to queue,
 queue size = 1
Worker 1 - took task Task A
It is Task A
Task A running...

经过几次尝试,我注意到,在“worker”内的循环末尾添加了额外的“await asyncio.sleep(1)”行 func 过程 运行 正确无误卡住了。

请问是什么原因?

谁能解释一下,为什么这一行会改变一切?

平台:Python3.9.4,Windows10 x64,在 venv.

我在后面添加了一行:

 async def worker(name):
 while True:
     print(f'{strftime("%X")}: worker loop')   #this line

而且我可以在输出中看到无休止的工作循环... 现在我明白了,工人找不到任务...

已解决:)