日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

twisted学习笔记

發布時間:2024/3/26 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 twisted学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.twisted 的異步基于Deferreds對象
使用twisted 編寫異步代碼時要先導入defer 和reactor

from twisted.internet import defer, reactor from twisted.web.client import getPagefrom twisted.internet import reactor, defer from twisted.web.client import getPagedef print_(n):"""將返回的數據解碼"""print(n.decode('UTF-8'))@defer.inlineCallbacks # 這個裝飾器方便我們返回多個Deferred對象 def func(n):print('%s開始' % n)# 使用twisted 里的函數發送網絡請求, 返回的是Deferred對象s = getPage('http://www.baidu.com'.encode('UTF-8'))# 添加回調函數s.addCallback(print_)print('休眠%s秒' % n)print('%s結束' % n)print('**********************\n')yield sdef down(arg):"""關閉事件循環reactor"""reactor.stop()if __name__ == '__main__':# 調用func函數并得到Deferred對象lis = [func(i) for i in range(3)]# 將Deferred對象放入DeferredListd = defer.DeferredList(lis)# 當DeferredList里的回調函數執行完了 就執行down函數d.addBoth(down)# 啟動reactorreactor.run()

2.用twisted寫一個超簡單的異步爬蟲

import queue from twisted.internet import defer #defer.Deferred(特殊的socket對象),不會發請求 from twisted.internet import reactor #socket對象(如果下載完成... from twisted.web.client import getPage #事件循壞class Request:def __init__(self, url, callback):self.url = urlself.callback = callbackclass HttpResponse:def __init__(self, content, request):self.content = contentself.request = requestself.url = request.urlself.text = str(content.decode('UTF-8'))class XueXiSpider:name = 'xue_xi'def start_request(self):start_url = ['http://www.baidu.com', 'http://www.bing.com', ]for url in start_url:yield Request(url, self.parse)def parse(self, response):print(response.url)yield Request('http://www.cnblogs.com', callback=self.parse)schedule = queue.Queue()class Engine:def __init__(self):# 用來關閉deferred對象self._close = None# 最大并發數self.max = 5# 存放要下載的request用來限制并發數self.crawling = []def get_response_callback(self, content, request):"""調用request的callback函數解析下載的內容并將返回的request對象壓入調度器:param content: 下載內容:param request: request對象:return:"""# 移除下載完的requestself.crawling.remove(request)# 生成response對象response = HttpResponse(content, request)# 調用parse解析responsereqs = request.callback(response)import types# 返回的是生成器對象就迭代它if isinstance(reqs, types.GeneratorType):for req in reqs:# 加入調度器schedule.put(req)def _next_request(self):"""不斷從隊列中獲取request, 當符合條件時關閉deferred對象:return:"""# 判斷是否要關閉deferred, defer.Deferred()對象需要手動關閉if len(self.crawling) == 0 and schedule.qsize() == 0:self._close.callback(None)return# 限制并發, crawling里的request屬相大于5就直接返回, 不在下載if len(self.crawling) > self.max:returnwhile len(self.crawling) < self.max:try:# 從調度器中取出request, block=False以不阻塞的方式req = schedule.get(block=False)# 將要下載的request加入下載列表中self.crawling.append(req)# 調用twisted的getPage 來發起url請求, getPage返回的對象在回調結束后會自動移除d = getPage(req.url.encode('UTF-8'))# 添加解析response回調d.addCallback(self.get_response_callback, req)# 數量不足添加next_request回調繼續獲取request下載d.addCallback(lambda _: reactor.callLater(0, self._next_request))except Exception as e:print(e)return@defer.inlineCallbacksdef crawl(self, spider_):"""將初始request壓入隊列, 定時啟動self._next_request:param spider_: spider對象:return: deferred對象"""# 獲取初始requeststart_requests = iter(spider_.start_request())while True:try:# 加入隊列schedule.put(next(start_requests))except StopIteration:break# 調用crawl函數后不會立刻執行self._next_request, 而是要等到reactor.run()調用后才會執行self._next_request# 0秒后調用self._next_requestreactor.callLater(0, self._next_request)# 創建不會自動結束的defer.Deferred()對象 賦值給self._close, 在隊列和下載列表為空時結束defer.Deferred()對象self._close = defer.Deferred()yield self._closeif __name__ == '__main__':# 創建集合存放deferred對象_active = set()# 生成spider對象spider = XueXiSpider()# 創建引擎engine = Engine()# 調用crawl方法 返回deferred對象d = engine.crawl(spider)_active.add(d)dd = defer.DeferredList(_active)# 添加結束回調, 當self._close.callback(None) 后停止reactordd.addBoth(lambda a: reactor.stop())# 啟動主事件循環reactor.run()# 注意上述代碼中deferred對象未添加addErrorback()錯誤處理函數, 一旦deferred回調函數出錯, 程序不會報錯, 會一直卡在那里# lambda 函數要加入一個參數, 不能不填參數

總結

以上是生活随笔為你收集整理的twisted学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品一线二线三线 | 在线观看视频 | 国产精品久久久久久一区二区 | 综合狠狠开心 | 大尺度做爰床戏呻吟舒畅 | 91国内在线 | 国产aⅴ激情无码久久久无码 | 免费在线视频一区二区 | 波多野结衣女同 | 国产成人精品一区二区三区网站观看 | 99久久久精品 | 欧美三级欧美成人高清 | 欧美大片大全 | 成人免费xxxxx在线观看 | 午夜精品久久久久久久无码 | 亚洲欧洲日本精品 | 中文字幕精品一区二区精 | 日韩欧美激情在线 | 国产69精品久久 | 深夜激情影院 | 朝鲜一级黄色片 | 国产精品国产精品国产专区不卡 | 国产精品久久久久久久久久久久久久久久久 | 一区二区久久久 | 真人一毛片 | 9l视频自拍九色9l视频成人 | 亚洲国产日韩一区无码精品久久久 | 亚洲熟妇毛茸茸 | 国产精品一二三四 | 香蕉久久影院 | 视频在线亚洲 | 超碰com| 亚洲影视一区二区 | 女儿的朋友4在线观看 | 亚洲性激情 | 亚洲欧美日韩电影 | 久久久精品久久久久久 | 欧美激情综合 | 熟女一区二区三区四区 | 久久福利影院 | 国产裸体永久免费视频网站 | 国产精品高清无码在线观看 | 亚洲AV无码成人精品区东京热 | 亚洲一区二区三区四区电影 | 日本三级中国三级99人妇网站 | 水蜜桃影库 | 亚洲不卡免费视频 | 女女同性高清片免费看 | 杨幂毛片 | 龚玥菲三级露全乳视频 | 国产性爱精品视频 | a天堂中文字幕 | 韩国性猛交╳xxx乱大交 | 91亚洲精品一区二区乱码 | 国产草草浮力影院 | 麻豆专区 | 在线播放波多野结衣 | 一级网站在线观看 | 国产香蕉视频在线播放 | 最新中文字幕免费 | 能在线观看的av网站 | 亚洲爽爽 | 国产青青草视频 | 蜜桃av噜噜一区二区三区 | 国产午夜精品一区二区三区 | 不卡日韩 | 青青自拍视频 | 成年人一级黄色片 | 中文字幕在线播放第一页 | 午夜精品久久久久久 | gav在线| 东京av在线| 色人阁五月 | 日本学生初尝黑人巨免费视频 | 尤物视频在线 | 欧洲成人在线观看 | 国产精品探花一区二区在线观看 | 亚洲国产精品国自产拍av | 91国偷自产中文字幕久久 | 亚洲欧美日韩久久精品 | 黄色工厂这里只有精品 | 国产一区二区三区视频免费观看 | 日本黄色激情视频 | 一级黄色美女视频 | 亚洲一区二区三区四区五区六区 | 精品无码人妻一区二区三区 | 日日操日日射 | 日韩二区视频 | 天天想你在线观看完整版高清 | 国产资源免费 | 国产精品911 | 亚洲天堂一区在线观看 | 少女国产免费观看 | 波多野结衣一区二区三区高清 | 波多野结衣影院 | 国产精品欧美综合亚洲 | 国产成人精品视频在线观看 | 日韩tv | 日韩精品国产AV |