我是python的新手并且正在努力理解我的协程无法正常工作的原因。
在当前代码中,唯一一个作业正在运行而另一个作业始终处于空闲状态。为什么?
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()))
答案 0 :(得分: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
TLDR:asyncio对它所说的很有用:异步执行任务,允许其他任务在当前任务等待某事时取得进展。没有什么是并行的。