Tornado非同步模式

2022-08-01 00:09:17 字數 1794 閱讀 6662

先介紹下背景:由於工作需要,前段時間又寫了一段爬蟲去獲取和更新一些資料。之前爬蟲主要用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 import

ioloop, periodiccallback

import

requests

# 業務邏輯操作寫在這裡

defjob():

url = '

'resp =requests.get(url)

print

(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 import

ioloop, periodiccallback

import

requests

from concurrent.futures import

threadpoolexecutor

# 業務邏輯寫在這裡

defjob():

url = '

'resp =requests.get(url)

print

(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的方式 ...