簡介
Twisted是一個基于Reactor模式的異步IO網絡架構,利用循環體來等待事件,進而實作異步程式設計和非阻塞IO,利用
deferred
來管理回調函數。
應用舉例
使用DeferredList管理
from twisted.web.client import getPage, defer
from twisted.internet import reactor
def all_done():
"""
停止reactor事件循環
:return:
"""
reactor.stop()
def error_back(e):
print(e)
def parse_page(res):
"""
定義回調函數
:param res:
:return:
"""
print(res)
return True
defer_list = []
urls = [
'https://www.xx.org',
'http://www.baidu.com',
'http://www.qq.com'
]
for url in urls:
# getPage會傳回一個deferred對象
obj = getPage(url.encode('utf-8'))
# 給Deferred對象添加回調
obj.addCallback(parse_page)
# 給Deferred添加錯誤回調
obj.addErrback(error_back)
# 将Deferred對象添加到清單中
defer_list.append(obj)
# 任務清單結束後,無論成敗都調用reactor.stop()停止
defer.DeferredList(defer_list).addBoth(all_done)
# 啟動事件循環監聽
reactor.run()
getPage發送POST請求
from twisted.internet import reactor
from twisted.web.client import getPage
import urllib.parse
def one_done(arg):
"""
停止循環體
:param arg:
:return:
"""
print(arg)
reactor.stop()
post_data = urllib.parse.urlencode({'username': 'abc'})
post_data = bytes(post_data, encoding='utf8')
headers = {b'Content-Type': b'application/x-www-form-urlencoded'}
# getPage傳回deferred,deferred用來管理回調
response = getPage(bytes('http://test/login', encoding='utf8'),
method=bytes('POST', encoding='utf8'),
postdata=post_data,
cookies={},
headers=headers)
# 請求正常或異常都調用one_done
response.addBoth(one_done)
# 啟動循環體
reactor.run()