成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Python實現(xiàn)具備元素唯一性的隊列

直奔主題,在用多線程寫一個爬蟲項目時,很自然的想到用“生產者-消費者”模式,但是又想實現(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è)前來合作!

  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!

新聞標題: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)

手機網(wǎng)站建設
昆山市| 隆德县| 十堰市| 长海县| 汉川市| 柳江县| 新建县| 鸡东县| 乌审旗| 英吉沙县| 长海县| 汾阳市| 富平县| 曲阜市| 西乌珠穆沁旗| 克东县| 永川市| 沁源县| 景宁| 将乐县| 忻城县| 阿克苏市| 鹰潭市| 保山市| 渭南市| 杭锦旗| 凌源市| 铜鼓县| 铁力市| 双辽市| 抚州市| 福清市| 集安市| 松桃| 和静县| 北海市| 紫金县| 普陀区| 深州市| 格尔木市| 岗巴县|