1. 程式人生 > 其它 >【協程】協程概念

【協程】協程概念

1、協程

  • 協程不是計算機提供的,是由程式設計師人為的建立的
  • 協程(Coroutine):也可以被稱為微執行緒,是一種使用者態內的上下文切換技術。簡而言之,其實就是通過一個執行緒實現程式碼塊相互切換執行

2、實現協程的幾種方法

  • greenlet
  • yield關鍵字
  • asyncio裝飾器(py3.4)
  • async await關鍵字(py3.5)【推薦】

3、greenlet實現協程

pip3 install greenlet
from greenlet import greenlet


def func1():
    print(1)  # 第二步,輸出1
    gr2.switch()
    print(2)  # 第四步,輸出2
    gr2.switch() # 第六步,無輸出


def func2():
    print(3) # 第三步,輸出3
    gr1.switch()
    print(4) # 第五步,輸出4 

gr1 = greenlet(func1)
gr2 = greenlet(func2)

gr1.switch() # 執行第一步

4、asyncio裝飾器實現協程

# -*- coding: utf-8 -*-
import asyncio


@asyncio.coroutine
def func1():
    print(1)
    yield from asyncio.sleep(2) # 通過IO耗時操作,自動化切換到tasks中的其他任務
    print(3)


@asyncio.coroutine
def func2():
    print(2)
    yield from asyncio.sleep(2) # 通過IO耗時操作,自動化切換到tasks中的其他任務
    print(4)


tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
  • 注意:遇到IO阻塞自動切換

5、async&await關鍵字【py3.5以後】

import asyncio


async def func1():
    print(1)
    await asyncio.sleep(2) # 通過IO耗時操作,自動化切換到tasks中的其他任務
    print(3)


async def func2():
    print(2)
    await asyncio.sleep(2) # 通過IO耗時操作,自動化切換到tasks中的其他任務
    print(4)


tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
  • 注意:遇到IO阻塞自動切換