python3.5協程

py2.x協程

  • yield:py2.x的協程都是通過yield生成器來實現的,可以說是模擬的協程(不能跨堆棧),yield可以暫停函數執行,send通知函數繼續往下執行,並提供給yield值,yield和send這種交互就構成了協程的基礎.

    2.x系列理解yield就理解協程,參考 http://blog.csdn.net/secretx/article/details/43969101 或者看書"編寫高質量代碼python代碼的99個建議"其中有一節講yield很不錯

  • gevent 2系列協程的王牌產品
    gevent 的兩個關鍵的部件:hub和loop。loop是Gevent 的核心部件,也就是事件循環核心,默認是用Cython寫的libev的包裝。hub則是一個greenlet,主協程,其他子協程由他創建並且調度,所有子協程交出CPU使用權都給他,他再給非阻塞的可執行的其他子協程,裏面跑着loop。

py3.4 asyncio

  • Python 3.3引入yield from(PEP 380),簡單點說就是可以在協程裏寫return,另一個協程裏yield from接收這個return值
  • Python3.4引入asyncio, asyncio是一個事件循環,類似libev,或者類比tornado的IOloop或者gevent的loop,hub,用來調度協程,同時使用@asyncio.coroutine來把函數裝飾成協程,搭配上yield from實現基於協程的異步併發,此時協程還是靠yield模擬

py3.5協程

  • async/await,  3.5引入的新東西,就簡單看成asyncio/yield from的升級版吧,在語言層面直接用async await提供對協程了支持,此後協程會與生成器yield分開界限

  • async def  定義一個協程func

    >>> async def coro():
    ...     return 'spam'

  • await  掛起當前協程用於非阻塞等待某個事件,比如IO;async for用於異步迭代其他協程返回的結果

    import asyncio
    async def httpget(domain): reader, writer = await asyncio.open_connection(domain,80)#等待鏈接成功 writer.write(b'\r\n'.join([b'GET / HTTP/1.1', b'Host: %b' % domain.encode('latin-1'), b'Connection: close', b'', b''])) async for line in reader:#異步迭代 print('>>>', line) writer.close()
    loop = asyncio.get
    eventloop() try: loop.run_until_complete(httpget('example.com')) finally: loop.close()

  • async with    asynchronous context managers,與with類似,僅僅用於管理協程的上下文環境

    import asyncio
    async def coro(name, lock):
        print('coro {}: waiting for lock'.format(name))
        async with lock:
            print('coro {}: holding the lock'.format(name))
            await asyncio.sleep(1)
            print('coro {}: releasing the lock'.format(name))
    loop = asyncio.get_event_loop() lock = asyncio.Lock() coros = asyncio.gather(coro(1, lock), coro(2, lock))
    try: loop.run_until_complete(coros) finally: loop.close()
    輸出結果
    coro 2: waiting for lock
    coro 2: holding the lock
    coro 1: waiting for lock
    coro 2: releasing the lock
    coro 1: holding the lock
    coro 1: releasing the lock
發佈了72 篇原創文章 · 獲贊 54 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章