Python实现具备元素唯一性的队列
2017-12-14 17:46
501 查看
直奔主题,在用多线程写一个爬虫项目时,很自然的想到用“生产者-消费者”模式,但是又想实现一个额外的需求,即如果爬虫爬到了队列中已存在的url,则不进行入队操作。想实现这个,大概面临两个问题:
1.
2. 即使1成立,如果在
进而观察了一下queue模块的源代码,因为Queue类是基于deque类实现的,那么就好办了:对
put方法源代码:
修改后的put方法
当然也可以仿照
Have fun!
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!
相关文章推荐
- Python中交换两个元素的实现方法
- 用python列表实现队列的功能
- 【Python】:拓展Queue实现有序不重复队列
- Python + Selenium 实现对页面的指定元素截图(可截长图元素)【转载】
- RabbitMQ(python实现)学习之二:Producer发送消息至多个消息队列queue(广播消息)
- 环形队列——C语言实现、python实现
- Python cookbook(数据结构与算法)实现优先级队列的方法示例
- 队列用链表实现(建立,插入新元素,删除元素,读取元素,全部删除,全部读出,判断是否为空,清空)
- python实现线程安全队列
- Python实现简单多线程任务队列
- 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
- 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
- 使用python实现栈和队列
- 选择第n小的元素之python实现源码
- Python笔记——几种数据结构的实现:栈、队列及二叉树
- python实现堆栈与队列的方法
- Python实现基础数据结构--队列
- 基于condition 实现的线程安全的优先队列(python实现)
- [python]队列的实现
- 一个小学奥数题的python实现(全排列,字符串循环移位,统计元素)