tornado框架基础11-tornado异步
生活中常常會遇到在超市排隊買東西的情況,排在你前面的人沒有結算完成,你就無法付賬,在計算機中也有類似的情形,一個程序在執行之前,需要等待其他的程序執行完成,大家還能舉出其他的例子嗎?
同步
含義:指兩個或兩個以上隨時間變化的量在變化過程中保持一定的相對關系?
?
直觀感受 :就是需要等候,效率低下
異步
含義 :雙方不需要共同的時鐘,也就是接收方不知道發送方什么時候發送,所以在發送的信息中就要有提示接收方開始接收的信息,如開始位,同時在結束時有停止位?
現象:沒有共同的時鐘,不考慮順序來了就處理?
直觀感受:就是不用等了,效率高
02 阻塞和非阻塞
同樣是剛才排隊的情形,當你在排隊的同時,你的狀態是怎樣的呢?在計算機里面應該怎么描述呢?
阻塞調用與非阻塞調用
阻塞調用
含義 : 阻塞調用是指調用結果返回之前,當前線程會被掛起(線程進入非可執行狀態,在這個狀態下,CPU不會給線程分配時間片,即線程暫停運行)。函數只有在得到結果之后才會返回?
現象:讀套接字時沒有數據等數據來,寫套接字時寫不下了也一直等,等能寫下了往里寫(套接字被寫滿的原因不在本地,在于網絡另一頭的套接字被寫滿了來不及讀出去,導致本地的套接字內容來發不出去堵住了)?
直觀感受:執著
非阻塞調用
含義 :非阻塞調用是指沒有調用結果立即返回,當前線程不被掛起,可以繼續做其它工作?
現象:讀套接字時沒有數據,不等直接返回干別的事去,寫套接字寫不下了也不寫了,直接返回干別的事去
直觀感受:勤奮
03 異步編程
三種方式:協程,回調函數,requests
在前面的介紹的基礎上,來看下 Tornado 中,當同時有多個請求發送過來時,而且其中還有請求發生阻塞,會產生什么樣的后果呢?
通過回調函數來實現異步
import tornado.httpclient
class CallbackHandler(BaseHandler): """通過回調函數來實現異步"""
@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() # 注意一定要加上,回調的異步完成后不會自動執行finish,所以在這里要手動加上.
通過協程實現異步
導入模塊
import tornado.gen
class GenHandler(BaseHandler): """通過協程實現的異步"""
@tornado.web.asynchronous
@tornado.gen.coroutine # coroutine 協程
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)
通過協程實現異步(自定義函數)
class FuncHandler(BaseHandler): """通過協程實現的異步"""
@tornado.web.asynchronous
@tornado.gen.coroutine # coroutine 協程
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)
通過協程來實現異步(使用requests模塊)
第一步:安裝模塊
pip install futures
pip install requests
第二步:導入模塊
from tornado.concurrent import run_on_executor
from concurrent.futures import ThreadPoolExecutor
import requests
通過協程來實現異步(使用requests模塊)
class MyFuncHandler(BaseHandler): """通過協程實現的異步"""
executor = ThreadPoolExecutor()
@tornado.web.asynchronous
@tornado.gen.coroutine # coroutine 協程
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")
轉載于:https://www.cnblogs.com/winfun/p/10974335.html
總結
以上是生活随笔為你收集整理的tornado框架基础11-tornado异步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实训流水账之day01—安装软件
- 下一篇: 微信APP支付开发步骤及要点