tornado框架基础11-tornado异步
生活中常常會遇到在超市排隊買東西的情況,排在你前面的人沒有結算完成,你就無法付賬,在計算機中也有類似的情形,一個程序在執(zhí)行之前,需要等待其他的程序執(zhí)行完成,大家還能舉出其他的例子嗎?
同步
含義:指兩個或兩個以上隨時間變化的量在變化過程中保持一定的相對關系?
?
直觀感受 :就是需要等候,效率低下
異步
含義 :雙方不需要共同的時鐘,也就是接收方不知道發(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")
轉載于:https://www.cnblogs.com/winfun/p/10974335.html
總結
以上是生活随笔為你收集整理的tornado框架基础11-tornado异步的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实训流水账之day01—安装软件
- 下一篇: 微信APP支付开发步骤及要点