日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tornado框架基础11-tornado异步

發(fā)布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tornado框架基础11-tornado异步 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

01 同步和異步

生活中常常會遇到在超市排隊買東西的情況,排在你前面的人沒有結算完成,你就無法付賬,在計算機中也有類似的情形,一個程序在執(zhí)行之前,需要等待其他的程序執(zhí)行完成,大家還能舉出其他的例子嗎?

同步

含義:指兩個或兩個以上隨時間變化的量在變化過程中保持一定的相對關系?

現(xiàn)象:有一個共同的時鐘,按來的順序一個一個處理?

直觀感受 :就是需要等候,效率低下

異步

含義 :雙方不需要共同的時鐘,也就是接收方不知道發(fā)送方什么時候發(fā)送,所以在發(fā)送的信息中就要有提示接收方開始接收的信息,如開始位,同時在結束時有停止位?

現(xiàn)象:沒有共同的時鐘,不考慮順序來了就處理?

直觀感受:就是不用等了,效率高

02 阻塞和非阻塞

同樣是剛才排隊的情形,當你在排隊的同時,你的狀態(tài)是怎樣的呢?在計算機里面應該怎么描述呢?

阻塞調(diào)用與非阻塞調(diào)用

阻塞調(diào)用

含義 : 阻塞調(diào)用是指調(diào)用結果返回之前,當前線程會被掛起(線程進入非可執(zhí)行狀態(tài),在這個狀態(tài)下,CPU不會給線程分配時間片,即線程暫停運行)。函數(shù)只有在得到結果之后才會返回?

現(xiàn)象:讀套接字時沒有數(shù)據(jù)等數(shù)據(jù)來,寫套接字時寫不下了也一直等,等能寫下了往里寫(套接字被寫滿的原因不在本地,在于網(wǎng)絡另一頭的套接字被寫滿了來不及讀出去,導致本地的套接字內(nèi)容來發(fā)不出去堵住了)?

直觀感受:執(zhí)著

非阻塞調(diào)用

含義 :非阻塞調(diào)用是指沒有調(diào)用結果立即返回,當前線程不被掛起,可以繼續(xù)做其它工作?

現(xiàn)象:讀套接字時沒有數(shù)據(jù),不等直接返回干別的事去,寫套接字寫不下了也不寫了,直接返回干別的事去

直觀感受:勤奮

03 異步編程

三種方式:協(xié)程,回調(diào)函數(shù),requests

在前面的介紹的基礎上,來看下 Tornado 中,當同時有多個請求發(fā)送過來時,而且其中還有請求發(fā)生阻塞,會產(chǎn)生什么樣的后果呢?

通過回調(diào)函數(shù)來實現(xiàn)異步

import tornado.httpclient

class CallbackHandler(BaseHandler): """通過回調(diào)函數(shù)來實現(xiàn)異步"""

   @tornado.web.asynchronous

  ?def get(self):

     client = tornado.httpclient.AsyncHTTPClient() # 異步的方

    client.fetch("http://127.0.0.1:8000/sync",callback=self.on_response) self.write('Ok!'+' ')

  def on_response(self,response): ?

     self.write(response.body) ?

     self.finish() # 注意一定要加上,回調(diào)的異步完成后不會自動執(zhí)行finish,所以在這里要手動加上.

通過協(xié)程實現(xiàn)異步

導入模塊

import tornado.gen

class GenHandler(BaseHandler): """通過協(xié)程實現(xiàn)的異步"""

   @tornado.web.asynchronous

   @tornado.gen.coroutine # coroutine 協(xié)程

  def get(self): ?

  client = tornado.httpclient.AsyncHTTPClient() ?

  response = yield tornado.gen.Task(client.fetch,"http://127.0.0.1:8000/sync") ?

  self.write(response.body)

通過協(xié)程實現(xiàn)異步(自定義函數(shù))

class FuncHandler(BaseHandler): """通過協(xié)程實現(xiàn)的異步"""

   @tornado.web.asynchronous

   @tornado.gen.coroutine # coroutine 協(xié)程

   def get(self):

   response = yield self.func()

   print(response)

   self.write(response.body)

   @tornado.gen.coroutine

   def func(self):

     client = tornado.httpclient.AsyncHTTPClient()

     response = yield tornado.gen.Task(client.fetch,"http://127.0.0.1:8000/sync")

     raise tornado.gen.Return(response)

通過協(xié)程來實現(xiàn)異步(使用requests模塊)

第一步:安裝模塊

pip install futures

pip install requests

第二步:導入模塊

from tornado.concurrent import run_on_executor

from concurrent.futures import ThreadPoolExecutor

import requests

通過協(xié)程來實現(xiàn)異步(使用requests模塊)

class MyFuncHandler(BaseHandler): """通過協(xié)程實現(xiàn)的異步"""

   executor = ThreadPoolExecutor()

   @tornado.web.asynchronous

   @tornado.gen.coroutine # coroutine 協(xié)程

   def get(self):

     response = yield self.func()

     print(response)

     self.write(response.text)

   @run_on_executor

   def func(self):

   response = requests.get("http://127.0.0.1:8000/sync")

   return response

轉載于:https://www.cnblogs.com/winfun/p/10974335.html

總結

以上是生活随笔為你收集整理的tornado框架基础11-tornado异步的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。