Python asyncio有两个任务,只有一个正在运行
我是python新手,很难理解为什么我的协同程序不起作用 在当前代码中,只有一个作业正在运行,而另一个作业始终处于空闲状态。为什么?Python asyncio有两个任务,只有一个正在运行,python,python-asyncio,Python,Python Asyncio,我是python新手,很难理解为什么我的协同程序不起作用 在当前代码中,只有一个作业正在运行,而另一个作业始终处于空闲状态。为什么? class Worker: def job1_sync(self): count = 0 while True: print('JOB A:', count) count = count + 1 def job2_sync(self): cou
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()))
Asyncio不执行多任务或多线程处理。它所做的是使用协作模型在一个线程内调度任务 也就是说,当当前任务
等待将“阻止”的某个内容时,事件循环再次运行,然后它才调度另一个任务。在后台,异步函数是协同路由,对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对它所说的有用:异步地做事情,允许其他任务在当前任务等待某件事情的同时取得进展。没有什么是并行的。是有意义的。我误解了整个概念。谢谢!OP可能正在查找is等待循环。在执行器中运行(无,self.job1\u sync)
async def job1_sync
与它自己的命名相矛盾-job1_sync
的全部要点可能是它调用传统或第三方同步代码,而这些代码可能不容易更改为async。尽管我认为已经了解asyncio并正在研究您描述的问题的人会以不同的方式提出这个问题,比如,如何将线程/ipc和asyncio结合使用。所以我猜这段代码是学习使用asyncio的人的完整示例。