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

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

我是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()))

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的人的完整示例。