直奔主題,在用多線程寫一個爬蟲項目時,很自然的想到用“生產者-消費者”模式,但是又想實現(xiàn)一個額外的需求,即如果爬蟲爬到了隊列中已存在的url,則不進行入隊操作。想實現(xiàn)這個,大概面臨兩個問題:
創(chuàng)新互聯(lián)是專業(yè)的汝城網(wǎng)站建設公司,汝城接單;提供成都網(wǎng)站設計、做網(wǎng)站、成都外貿網(wǎng)站建設公司,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行汝城網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
Queue
對象不支持in
操作Queue
對象外部通過if item in q
這種形式也行不通,因為該過程無鎖,多線程情況下就無法保證查詢結果的準確性進而觀察了一下queue模塊的源代碼,因為Queue類是基于deque類實現(xiàn)的,那么就好辦了:對put
方法稍加改造,增加一個unique
參數(shù),依據(jù)此參數(shù)是否為True,在底層的deque中判斷要加入的元素的存在性,以此可實現(xiàn)類似set的特性。
put方法源代碼:
def put(self, item, block=True, timeout=None):
with self.not_full:
if self.maxsize > 0:
if not block:
if self._qsize() >= self.maxsize:
raise Full
elif timeout is None:
while self._qsize() >= self.maxsize:
self.not_full.wait()
elif timeout < 0:
raise ValueError("'timeout' must be a non-negative number")
else:
endtime = time() + timeout
while self._qsize() >= self.maxsize:
remaining = endtime - time()
if remaining <= 0.0:
raise Full
self.not_full.wait(remaining)
self._put(item)
self.unfinished_tasks += 1
self.not_empty.notify()
修改后的put方法
def put(self, item, block=True, timeout=None, unique=False):
"""增加了unique參數(shù)"""
with self.not_full:
#----- 以下三行為新增代碼 -----#
if unique:
if item in self.queue:
return
#----- 新增代碼結束 -----#
if self.maxsize > 0:
if not block:
if self._qsize() >= self.maxsize:
raise Full
elif timeout is None:
while self._qsize() >= self.maxsize:
self.not_full.wait()
elif timeout < 0:
raise ValueError("'timeout' must be a non-negative number")
else:
endtime = time() + timeout
while self._qsize() >= self.maxsize:
remaining = endtime - time()
if remaining <= 0.0:
raise Full
self.not_full.wait(remaining)
self._put(item)
self.unfinished_tasks += 1
self.not_empty.notify()
當然也可以仿照put_nowait
方法增加一個快捷方法put_unique
,如下
def put_unique(self, item, block=True, timeout=None):
return self.put(item, block, timeout, unique=True)
Have fun!
新聞標題:Python實現(xiàn)具備元素唯一性的隊列
URL標題:http://jinyejixie.com/article26/psiejg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供域名注冊、網(wǎng)站維護、網(wǎng)站導航、響應式網(wǎng)站、建站公司、網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)