真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python實現(xiàn)具備元素唯一性的隊列-創(chuàng)新互聯(lián)

直奔主題,在用多線程寫一個爬蟲項目時,很自然的想到用“生產(chǎn)者-消費者”模式,但是又想實現(xiàn)一個額外的需求,即如果爬蟲爬到了隊列中已存在的url,則不進行入隊操作。想實現(xiàn)這個,大概面臨兩個問題:

創(chuàng)新互聯(lián)2013年開創(chuàng)至今,先為競秀等服務建站,競秀等地企業(yè),進行企業(yè)商務咨詢服務。為競秀企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
  1. Queue對象不支持in操作
  2. 即使1成立,如果在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!

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


當前文章:Python實現(xiàn)具備元素唯一性的隊列-創(chuàng)新互聯(lián)
當前路徑:http://weahome.cn/article/hjece.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部