2017-08-13 87 views
2

一種編程風格,其中任務在等待期間釋放CPU,以便其他任務可以使用它。python asyncIO如何暫停和恢復任務?

要引入異步任務,

  • 任務應該能夠暫停&恢復
  • 事件調度應該安排這些任務(準備好時)

寫事件scheduler,但卡在啓用異步task。假設任務被IO綁定。調度程序在任務執行過程中不會獲得CPU分片,因爲任務會同步執行。


Python中的任務(bar),成爲異步任務(可暫停&恢復),當任務使用asyncawait關鍵字ayncio.onSomeIO能夠等待,

async def bar(): 
    await asyncio.onSomeIO() 

問題:

如何asyncio包使bar成爲一個異步任務,與這些關鍵字,在引擎蓋下?每個任務是否在單獨的線程上啓動?

+3

您可能想看看下面的[Brett Cannon的文章](https://snarky.ca/how-the-heck-does-async-await-work-in-python-3-5/)異步/等待的底線是什麼?它非常深入,但它不是一個可以在S/O上輕鬆實現的主題。 – Gavin

回答

2

是否每個任務都在單獨的線程上啓動?

不,通常asyncio在單線程中運行。

asyncio軟件包如何使用這些 關鍵字使欄成爲異步任務?

當你定義功能async這個功能變得發生器就是允許「的步驟」使用__next__()方法來執行它。 await - 是yield(實際上爲yield from)指向執行流程返回到管理所有協程執行的全局事件循環的位置。

這個簡單的例子說明了如何可以在不同的發生器的執行流之間進行切換:

def task(i): 
    yield 1 
    print('task {}: step 1'.format(i)) 
    yield 2 
    print('task {}: step 2'.format(i)) 


tasks = [ 
    task(1), 
    task(2), 
    task(3), 
] 


def execute_tasks(tasks): 
    i = 0 
    finished = [] 
    while True: 
     # start executing tasks: 
     try: 
      tasks[i].__next__() 
     except StopIteration: 
      finished.append(i) 
     # check if any task unfinished: 
     if len(finished) == len(tasks): 
      return 
     # move to next unfinished task: 
     while True: 
      i += 1 
      if i > len(tasks) - 1: 
       i = 0 
      if not i in finished: 
       break 


if __name__ == '__main__': 
    execute_tasks(tasks) 

輸出:

task 1: step 1 
task 2: step 1 
task 3: step 1 
task 1: step 2 
task 2: step 2 
task 3: step 2 

當然asyncio要複雜得多,並且允許你更多。

可能最好的解釋,你可以如何使用生成器實現協同程序我在這個PyCon 2015視頻中看到:David Beazley - Python Concurrency From the Ground Up: LIVE!source code)。如果你要實施這個,你一定要看。

但我建議您使用asyncio來代替它 - 它已經存在,無需自己創造。

+0

我們可以請求一些IO綁定操作來代替'yield 1'嗎?我有這個代碼[這裏](https://github.com/shamhub/DataProcsngAnalytics/tree/master/1_Pipeline_processing)沒有事件循環 – overexchange

+0

@overxchange嘗試查看視頻中的代碼我給了上面的鏈接(我添加了鏈接代碼在那裏)。 'run()'那裏 - 實際上是事件循環。 1)它告訴任務要執行,直到I/O操作(第43行)2)任務在I/O操作中產生,以將控制權返回到事件循環(第82,88,94,96行)3)當事件循環查看所有待處理任務它使用'select'來等待一些I/O完成(第33行)。 –

+0

Pycon介紹令人驚歎。不知道,我怎麼錯過了? – overexchange