python queue put阻塞_python queue length_queue length_python queue put

如何检查python Queue中是否已有任务?

我正在使用线程和队列模块在Python中编写一个简单的爬虫程序。我获取一个页面,检查链接并将它们放入队列,当某个线程完成处理页面时,它从队列中抓取下一个。我正在为我已经访问过的页面使用一个数组来过滤我添加到队列中的链接,但是如果有多个线程并且它们在不同的页面上获得相同的链接,则它们会将重复的链接放入队列。那么如何才能知道某个网址是否已经在队列中以避免再次将其放入队列中?

所属话题:,发起人:zhic,时间:2018-08-02,浏览:720

我解决这个问题的方式(实际上我是用Scala而不是Python做的)是同时使用Set和Queue,只添加到队列(和set)的链接(如果它们尚未存在于集合中)。set和queue都封装在一个线程中,只向消费者线程公开类似队列的接口。编辑:其他人建议SQLite,这也是我正在考虑的事情,如果访问的URL集需要增长。 (目前每次抓取只有几百页,因此很容易适合内存。)但是也可以封装在集合本身中,因此消费者线程无需了解它。

xhic2018-08-02

SQLite非常简单易用,非常适合......只是一个建议。

iullam2018-08-02

这 个属于集合类的查找机制问题,在集合类中,确定两个元素是否相同,是用equals方法进行比较,hashcode的存在在于可以给元素快速分配一个 index来存储。collections是个java.util下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的查找、排序、替换、线程安全化(将非同步的集合转换成同步的)等操作。2. 在hadoop 中我们经常需要对两个文件做一个join操作,即取两个文件的交集,或者在一个集合中过滤掉特定的集合,如果这个一个集合很小, 我们可以把这个集合加入到一个字典中,然后过滤, 在mapper 中这么写。

kquis2018-08-02

使用:CODE_0的PLACEHOLDER如果url在队列中,则返回True

fet2018-08-02

为什么只使用数组(理想情况下,字典会更好)来过滤你已经访问过的东西?将它们排队后立即添加到数组/字典中,只有当它们不在数组/字典中时才将它们添加到队列中。然后你有3个简单的单独的东西:

尚未见到的链接(无论是在队列中还是在数组/字典中)

计划访问的链接(在队列和数组/字典中)

已访问的链接(在array/dict中python queue length,不在队列中)

jautem2018-08-02

如果您不关心处理项目的顺序,我会尝试在内部使用set的Queue的子类:

class SetQueue(Queue):

def _init(self, maxsize):

self.maxsize = maxsize

self.queue = set()

def _put(self, item):

self.queue.add(item)

def _get(self):

return self.queue.pop()正如Paul McGuire指出的那样,这将允许在从“待处理”集中删除并且尚未添加到“已处理”集合之后添加重复项目。要解决此问题,您可以将这两个集存储在Queue实例中,但由于您使用较大的集来检查项目是否已被处理,因此您也可以返回queue,它将正确地命令请求。class SetQueue(Queue):

def _init(self, maxsize):

Queue._init(self, maxsize)

self.all_items = set()

def _put(self, item):

if item not in self.all_items:

Queue._put(self, item)

self.all_items.add(item)与单独使用集合相反,这样做的优点是Queue的方法是线程安全的,因此您不需要额外的锁定来检查另一个集合。

quia_a2018-08-02

而不是“已访问的页面数组”使“已添加到队列中的页面数组”

datque2018-08-02

put方法也需要被覆盖,否则连接调用将永远阻塞

class UniqueQueue(Queue):

def put(self, item, block=True, timeout=None):

if item not in self.queue: # fix join bug

Queue.put(self, item, block, timeout)

def _init(self, maxsize):

self.queue = set()

def _put(self, item):

self.queue.add(item)

def _get(self):

return self.queue.pop()

prem2018-08-02

可悲的是python queue length,我没有评价最佳LukášLalinský的答案。要为LukášLalinský的SetQueue的第二个变体添加对SetQueue.task_done()和SetQueue.join()的支持,请将if brahch添加到if:

def _put(self, item):

if item not in self.all_items:

Queue._put(self, item);

self.all_items.add(item);

else:

self.unfinished_tasks -= 1;经过测试并使用Python 3.4。

uut2018-08-02

这是SetQueue的完整版本

import Queue

class SetQueue(Queue.Queue):

def _init(self, maxsize):

Queue.Queue._init(self, maxsize)

self.all_items = set()

def _put(self, item):

if item not in self.all_items:

Queue.Queue._put(self, item)

self.all_items.add(item)

def _get(self):

item = Queue.Queue._get(self)

self.all_items.remove(item)

return item

nqui2018-08-02

以下是对LukášLalinský后者solution的改进。重要的区别是put被覆盖以确保unfinished_tasks准确且join按预期工作。

from queue import Queue

class UniqueQueue(Queue):

def _init(self, maxsize):

self.all_items = set()

Queue._init(self, maxsize)

def put(self, item, block=True, timeout=None):

if item not in self.all_items:

self.all_items.add(item)

Queue.put(self, item, block, timeout)

taut2018-08-02

我同意@Ben James。试着同时使用deque和set。这是代码:

class SetUniqueQueue(Queue):

def _init(self, maxsize):

self.queue = deque()

self.setqueue = set()

def _put(self, item):

if item not in self.setqueue:

self.setqueue.add(item)

self.queue.append(item)

def _get(self):

return self.queue.popleft()

dsed2018-08-02

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-112482-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值