国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python:Tornado 第一章:異步及協程基礎:第三節:協程

charles_paul / 455人閱讀

摘要:上一篇文章第一章異步及協程基礎第二節關鍵字下一篇文章第二章實戰演練開發網站第一節網站結構使用協程可以開發出類似同步代碼的異步行為。協程函數可以通過以下三張方式調用在本身是協程的函數內通過關鍵字調用。

上一篇文章:Python:Tornado 第一章:異步及協程基礎:第二節:Python關鍵字yield
下一篇文章:Python:Tornado 第二章:實戰演練:開發Tornado網站:第一節:網站結構:HelloWorld

使用Tornado協程可以開發出類似同步代碼的異步行為。同時,因為協程本身不使用線程,所以減少了線程上下文切換的開銷,是一種高效的開發模式。

1、編寫協程函數

實例:用協程技術開發網頁訪問功能

#用協程技術開發網頁訪問功能
from tornado import  gen #引入協程庫gen
from tornado.httpclient import AsyncHTTPClient
import time

#使用gen.coroutine修飾器
@gen.coroutine
def coroutine_visit():
    http_client=AsyncHTTPClient()
    response=yield http_client.fetch("http://www.baidu.com")
    print(response.body)

本例中任然使用了異步客戶端AsyncHTTPClient進行頁面訪問,裝飾器@gen.coroutine聲明這是一個協程函數,由于yield關鍵字的作用,使得代碼中不用再編寫回調函數用于處理訪問結果,而可以直接在yield語句的后面編寫結果處理語句。

2、調用協程函數

由于Tornado協程基于Python的yield關鍵字實現,所以不能像普通函數那樣直接調用。
協程函數可以通過以下三張方式調用:

在本身是協程的函數內通過yield關鍵字調用。

在IOLoop尚未啟動時,通過IOLoop的run_sync()函數調用。

在IOLoop已經啟動時,通過IOLoop的spawn_callback()函數調用。

實例:通過協程函數調用協程函數

代碼:

#用協程技術開發網頁訪問功能
from tornado import  gen #引入協程庫gen
from tornado.httpclient import AsyncHTTPClient
import time

#使用gen.coroutine修飾器
@gen.coroutine
def coroutine_visit():
    http_client=AsyncHTTPClient()
    response=yield http_client.fetch("http://www.baidu.com")
    print(response.body)

@gen.coroutine
def outer_coroutine():
    print("start call coroutine_visit")
    yield coroutine_visit()
    print("end call coroutine_cisit")

本例中outer_coroutine()和coroutine_visit()都是協程函數,所以他們之間可以通過yield關鍵字調用。_

實例:IOLoo尚未啟動時,通過IOLoop的run_sync()函數調用。
IOLoop是Tornado的主事件循環對象,Tornado程序通過它監聽外部客戶端的訪問請求,并執行相應操作。

代碼:

#用協程技術開發網頁訪問功能
from tornado import  gen #引入協程庫gen
from tornado.httpclient import AsyncHTTPClient
from tornado.ioloop import IOLoop  #引入IOLoop對象

#使用gen.coroutine修飾器
@gen.coroutine
def coroutine_visit():
    http_client=AsyncHTTPClient()
    response=yield http_client.fetch("http://www.baidu.com")
    print(response.body)

def func_normal():
    print("start call coroutine_visit")
    IOLoop.current().run_sync(lambda :coroutine_visit())
    print("end call coroutine_visit")
當程序尚未進入IOLoop的running狀態時,可以通過run_sync()函數調用協程函數。

??注意:run_sync()函數將阻塞當前函數的調用,直到被調用的協程執行完成。

事實上,Tornado要求協程函數在IOLoop的running狀態種才能被調用,只不過run_sync函數自動完成了啟動、停止IOLoop的操作步驟,他的實現邏輯是:

【啟動IOLoop】》【調用被lambda封裝的協程函數】》【停止IOLoop】

實例:在IOLoop啟動時,通過spawn_callback()函數調用

代碼:

#用協程技術開發網頁訪問功能
from tornado import  gen #引入協程庫gen
from tornado.httpclient import AsyncHTTPClient
from tornado.ioloop import IOLoop  #引入IOLoop對象

#使用gen.coroutine修飾器
@gen.coroutine
def coroutine_visit():
    http_client=AsyncHTTPClient()
    response=yield http_client.fetch("http://www.baidu.com")
    print(response.body)

def func_normal():
    print("start call coroutine_visit")
    IOLoop.current().spawn_callback(coroutine_visit)
    print("end call coroutine_visit")
spawn_callback()函數將不會等待被調用協程執行完成,所有上下兩條打印語句將馬上完成,而coroutine__visit本身將會由IOLoop在合適的時機進行調用。

??注意:IOLoop的spawn_callback()函數沒有為開發者提供獲取協程函數調用返回值的方法,所以只能用span_callback()調用沒有返回值的協程函數。

3、在協程中調用阻塞函數
在協程中直接調用阻塞函數會影響協程本身的性能,所以Tornado提供了在協程中利用線程池調度阻塞函數,從而不影響協程本身繼續執行的方法。

代碼實例:

from concurrent.futures import ThreadPoolExecutor
from tornado import gen

#定義線程池
thread_pool=ThreadPoolExecutor(2)

def mySleep(count):
    import time
    for x in range(count):
        time.sleep(1)

@gen.coroutine
def call_blocking():
    print("start")
    yield thread_pool.submit(mySleep,10)
    print("end")

代碼中首先引用了concurrent.futures種的ThreadPoolExecutor類,實例化了一個由兩個線程的線程池thread_pool。在需要調用阻塞函數的協程call_blocking種,使用thread_pool.submit調用阻塞函數,并通過yield返回。這樣便不會阻塞協程所在的線程的繼續執行,也保證了阻塞函數前后代碼的執行順序。

4、在協程中等待多個異步調用
到目前為止,我們知道了協程中一個yield關鍵字等待一個異步調用的編程方法。其實,Tornado允許在協程中用一個yield關鍵字等待多個異步調用,只需要把這些調用以列表(list)或字典(dictionary)的方式傳遞給yield關鍵字即可。
實例:使用列表方式傳遞多個異步調用
#使用列表方式傳遞多個異步調用
from tornado import gen  #引入協程庫gen
from tornado.httpclient import AsyncHTTPClient

@gen.coroutine   #使用gen.coroutine修飾器
def coroutine_visit():
    http_client=AsyncHTTPClient()
    list_response=yield [
        http_client.fetch("http://www.baidu.com"),
        http_client.fetch("http://www.api.jiutouxiang.com")
    ]
    for response in list_response:
        print(response.body)


在代碼中仍然使用@gen.coroutine裝飾器定義協程,在需要yield的地方用列表傳遞若干個異步調用,只有在列表種的所有調用都執行完成后,yield才會返回并且繼續執行。yield以列表方式返回調用結果。

實例:用字典方式傳遞多個異步調用:
#使用列表方式傳遞多個異步調用
from tornado import gen  #引入協程庫gen
from tornado.httpclient import AsyncHTTPClient

@gen.coroutine   #使用gen.coroutine修飾器
def coroutine_visit():
    http_client=AsyncHTTPClient()
    dict_response=yield {
       "baidu": http_client.fetch("http://www.baidu.com"),
        "9siliao":http_client.fetch("http://www.api.jiutouxiang.com")
    }
    print(dict_response["baidu"].body)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42598.html

相關文章

  • PythonTornado 一章異步協程基礎:第二節:Python關鍵字yield

    摘要:在種,使用關鍵字定義的迭代器也被稱為生成器迭代器迭代器是訪問集合內元素的一種方式。調用任何定義包含關鍵字的函數都不會執行該函數,而是會獲得一個隊應于該函數的迭代器。 上一篇文章:Python:Tornado 第一章:異步及協程基礎:第一節:同步與異步I/O下一篇文章:Python:Tornado 第一章:異步及協程基礎:第三節:協程 協程是Tornado中進行異步I/O代碼開發的方法...

    reclay 評論0 收藏0
  • PythonTornado 一章異步協程基礎第一節:同步與異步I/O

    摘要:上一篇文章開篇下一篇文章第一章異步及協程基礎第二節關鍵字協程是種推薦的編程方式,使用協程可以開發出簡捷高效的異步處理代碼。同步操作,導致進程阻塞,直到操作完成異步操作,不會導致請求進程阻塞。 上一篇文章:Python:Tornado 開篇下一篇文章:Python:Tornado 第一章:異步及協程基礎:第二節:Python關鍵字yield 協程是Tornado種推薦的編程方式,使用協...

    Anleb 評論0 收藏0
  • PythonTornado 第二章:實戰演練:開發Tornado網站:第一節:網站結構:Hello

    摘要:上一篇文章第一章異步及協程基礎第三節協程下一篇文章第二章實戰演練開發網站第二節網站結構路由解析實例瀏覽器輸入鏈接頁面顯示下面逐行解析上面的代碼做了些什么首先通過語句引入包中的和類。該對象的第一個餐食用于定義程序的路由映射。 上一篇文章:Python:Tornado 第一章:異步及協程基礎:第三節:協程下一篇文章:Python:Tornado 第二章:實戰演練:開發Tornado網站:第...

    Taonce 評論0 收藏0
  • PythonTornado 開篇

    摘要:作為網站的基礎框架,于年月日發布,目前已經獲得了很多社區的支持,并且在一系列不同的場景種得到應用。使用該框架,開發者能夠快速開發出即安全又強大的用戶身份認證機制,例如機制用戶身份認證防止跨站攻擊等等。 下一篇文章:Python:Tornado 第一章:異步及協程基礎:第一節:同步與異步I/O Tornado是一個可擴展的非阻塞Web服務器以及相關工具的總稱。Tornado每秒可以處理...

    Anshiii 評論0 收藏0
  • Tornado 4.3文檔翻譯: 用戶指南-協程

    摘要:譯者說于年月日發布,該版本正式支持的關鍵字,并且用舊版本編譯同樣可以使用這兩個關鍵字,這無疑是一種進步。其次,這是最后一個支持和的版本了,在后續的版本了會移除對它們的兼容。 譯者說 Tornado 4.3于2015年11月6日發布,該版本正式支持Python3.5的async/await關鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個關鍵字,這無疑是一種進步。其次...

    SimonMa 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<