簡體   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