91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python實現具備元素唯一性的隊列

發布時間:2020-04-28 08:07:37 來源:網絡 閱讀:648 作者:kai404 欄目:編程語言

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

  1. Queue對象不支持in操作
  2. 即使1成立,如果在Queue對象外部通過if item in q這種形式也行不通,因為該過程無鎖,多線程情況下就無法保證查詢結果的準確性

進而觀察了一下queue模塊的源代碼,因為Queue類是基于deque類實現的,那么就好辦了:put方法稍加改造,增加一個unique參數,依據此參數是否為True,在底層的deque中判斷要加入的元素的存在性,以此可實現類似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參數"""
        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!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德昌县| 孝义市| 德令哈市| 东阳市| 昭平县| 沙湾县| 驻马店市| 海盐县| 泰来县| 衡南县| 湖口县| 上虞市| 宁海县| 武乡县| 九龙坡区| 云阳县| 环江| 长垣县| 冀州市| 田阳县| 固安县| 长宁区| 孝感市| 彭阳县| 化德县| 金湖县| 尉氏县| 当阳市| 长寿区| 石嘴山市| 瓦房店市| 营山县| 增城市| 太和县| 茌平县| 临清市| 泸州市| 寿光市| 象山县| 峨边| 新宁县|