先介紹下背景:由於工作需要,前段時間又寫了一段爬蟲去獲取和更新一些資料。之前爬蟲主要用scrapy框架批量爬取一些頁面資料,或者用gevent呼叫目標站點的介面。偶然看到了tornado,聽說這個框架很強大,所以打算這次爬蟲用tornado試試。不足之處,歡迎指正。
總的來說,tornado是python裡面乙個輕量的非同步非阻塞的框架,效能非常不錯,最新版本的非同步協程是基於python內建的asyncio來實現(老版本用裝飾器實現非同步)。tornado可以用來做web服務,或者利用其非同步功能,完成一些非同步執行的操作,比如爬蟲(pyspider就是基於tornado實現)。
說了那麼多,重點來了。tornado兩種非同步模式:
1,add_callback(基於asyncio,資源消耗少,效能還不錯)
2,run_in_executor((基於執行緒池/程序池,效能很好,但是資源消耗要高於add_callback的方案)
兩種模式的**如下。
add_callback方案:
from tornado.ioloop importioloop, periodiccallback
import
requests
# 業務邏輯操作寫在這裡
defjob():
url = '
'resp =requests.get(url)
(resp.text)
async
defrunner():
loop =ioloop.current()
#任務派發寫在這裡
for i in range(10):
loop.add_callback(job)
print('
this will be executed before loop is finished')
if__name__ == '
__main__':
ioloop.current().run_sync(runner)
run_in_executor方案:
from tornado.ioloop importioloop, periodiccallback
import
requests
from concurrent.futures import
threadpoolexecutor
# 業務邏輯寫在這裡
defjob():
url = '
'resp =requests.get(url)
(resp.text)
async
defrunner():
loop =ioloop.current()
#也可以用程序池processpoolexecutor
exectutor = threadpoolexecutor(20)
# 任務派發寫在這裡
for i in range(10):
loop.run_in_executor(exectutor, job)
print('
this will be executed before loop is finished')
if__name__ == '
__main__':
ioloop.current().run_sync(runner)
Tornado非同步學習
why asynchronous tornado是乙個非同步web framework,說是非同步,是因為tornado server與client的網路互動是非同步的,底層基於io event loop。但是如果client請求server處理的handler裡面有乙個阻塞的耗時操作,那麼整體的s...
Tornado 非同步socketTCP通訊
tornado 有 tcpclient 和 tcpserver 兩個類,可用於實現 tcp 的客戶端和服務端。事實上,這兩個類都是對iostream的簡單包裝。iostream 是 client 與 server 之間的 tcp 通道。被動等待建立 iostream 的一方是 server,主動找對...
tornado中非同步request使用
使用httprequest太無腦了,太莽了,當希望使用非同步request時,首先引入asynchttprequest from tornado.httpclient import asynchttpclient將介面中的方法新增上tornado的協程符 coroutine根據request的方式 ...