使用tornado的gen模組改善程式效能

2022-05-23 04:15:08 字數 1588 閱讀 6910

之前在公司的乙個模組,需要從另一處url取得資料,我使用了python的乙個很著名的lib,叫做requests。但是這樣做極大的降低了程式的效能,因為tornado是單執行緒的,它使用了所謂的reactor模式,底層使用epoll監聽每個tcp連線,上層再經過封裝,接受http請求。所以,tornad實際上是單執行緒的。

在實際的場景中,經常採用nginx反向**的模式,然後伺服器開啟多個tornado程序,接受nginx傳送過來的請求。

剛才的問題主要是,因為requests是阻塞的,所以當我發出乙個post請求,整個tornado程序就阻塞了,此時該程序不能接受任何的其他請求。

想想我們的伺服器總共才十幾個tornado程序,可能要應對上千的併發量,所以阻塞乙個程序對我們是巨大的損失。

tornado內建了非同步的模組,例如asynchttpclient,它的使用如下:

那麼,tornado的gen是怎麼回事? 可以看到,上面的**中使用了**函式,但是**函式有乙個致命的問題,如果邏輯非常複雜,那麼我們的程式可能巢狀多層**,造成所謂的「**地獄」。

事實上,tornado的gen模組,就是為了改善這一問題。例如:

從上面可以看出,gen模組的最大作用,就是將非同步**的編寫進行改進,使其看起來像同步。

上面的**執行時,遇到yield後面的阻塞呼叫則暫停,然後去執行其他請求,等該資料返回時,再繼續處理這裡。

這樣就防止了乙個io操作阻塞整個程序。

在實際應用中,對於可能阻塞的操作(例如查詢量較大的資料庫查詢),最好使用非同步。

tornado 增加日誌模組

usr bin env python coding utf 8 import logging.handlers class logger logging.logger def init self,filename none super logger,self init self 日誌檔名 if fi...

Tornado 框架的使用

tornado是乙個輕量級python的web框架,他是非阻塞式的,而且速度非常快.得利於其 非阻塞的方式和對 epoll 的運用,tornado 每秒可以處理數以千計的連線,這意味著對於實時 web 服務來說,tornado 是乙個理想的 web 框架。usr bin env python cod...

Tornado模組分類和各模組之間的關係

1.core web framework tornado.httpserver 乙個無阻塞http伺服器的實現 tornado.template 模版系統 tornado.escape html,json,urls等的編碼解碼和一些字串操作 tornado.locale 國際化支援 2.asynch...