繁体   English   中英

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

[英]Python asyncio two tasks and only one is running

我是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将“阻塞”的事件时,事件循环再次运行,然后才调度另一个任务。 在幕后,异步功能是协程,调用await会使事件循环的corouting屈服,在出现等待条件时,它会在稍后的点恢复。

在这里,您永远不会等待任何事情,因此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对于它所说的内容很有用:异步执行任务,允许其他任务在当前任务等待某事时取得进展。 没有并行运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM