Python asyncio有两个任务,只有一个正在运行

Wil*_*oat 2 python python-asyncio

我是python的新手,并努力理解为什么我的coroutine不工作.

在当前代码中,唯一一个作业正在运行而另一个作业始终处于空闲状态.为什么?

class Worker:    
    def job1_sync(self):
        count = 0
        while True:
            print('JOB A:', count)
            count = count + 1

    def job2_sync(self):
        count = 0
        while True:
            print('JOB B:', count)
            count = count + 1

    async def job1(self):
        await self.job1_sync()

    async def job2(self):
        await self.job2_sync()

    worker = Worker()
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    loop.run_until_complete(asyncio.gather(worker.job1(), worker.job2()))
Run Code Online (Sandbox Code Playgroud)

spe*_*ras 5

Asyncio不执行多任务或多线程.它的作用是使用协作模型在一个线程内安排任务.

也就是说,当当前任务await将"阻塞" 时,事件循环再次运行,然后它才会调度另一个任务.在引擎盖下,异步函数是协同程序,并且await在等待条件出现时调用以使事件循环成为事件循环,并在稍后的时间点恢复.

在这里你永远不会等待任何东西,所以job1永远不会放弃控制,所以事件循环永远不会有机会将计算能力分配给其他任务.

现在如果你的工作是实际放弃控制,比如通过触发延迟,那么你的代码就可以了:

async def job1_sync(self):      # note the async : only async functions can await
    count = 0
    while True:
        print('JOB A:', count)
        count = count + 1
        await asyncio.sleep(1)  # main even loop gets control
Run Code Online (Sandbox Code Playgroud)

TLDR:asyncio对于它所说的内容非常有用:异步执行任务,允许其他任务在当前任务等待某事时取得进展.什么都没有并行运行.