当前位置: 首页 > 面试题库 >

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

乐正穆冉
2023-03-14
问题内容

我正在使用线程和队列模块在Python中编写一个简单的搜寻器。我获取一个页面,检查链接并将它们放入队列中,当某个线程完成页面处理后,它将从队列中获取下一个页面。我对已经访问过的页面使用数组,以过滤添加到队列的链接,但是如果有多个线程并且它们在不同页面上获得相同的链接,则会将重复的链接放入队列。那么,如何确定队列中是否已经有一些url以避免再次放置?


问题答案:

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

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的方法是线程安全的,因此您不需要其他锁定即可检查另一个集合。



 类似资料:
  • 问题内容: 我有一个名为Person的表,一个名为ID的列,如何检查ID是否已经是FOREIGN KEY,原因是我想使用以下代码进行修改: 但是如果ID已经是FOREIGN KEY,则由于有两个级联的情况,它给我以下错误“可能导致循环或多个级联路径” …如何检查此字段是否为FOREIGN KEY以避免此错误? 问题答案: 您想看一下视图 虽然还不如应有的完整。这是您想要的最终查询: 浏览此处获取更

  • 我有一个服务器端应用程序,客户端可以请求重新加载配置。如果一个客户端请求重新加载配置,这不应该立即完成,而是延迟1分钟。如果另一个客户端也在同一分钟内请求重新加载配置,这个请求应该被忽略。 我的想法是安排一个任务与调度ExecutorService像: 如何检查LoadConfigurationTask是否已计划但尚未执行,以便在重新加载配置之前忽略进一步的请求?

  • 以下是示例代码: (由于某种原因,这里的窗户关闭了) 回溯(最后一次调用):文件“/usr/local/lib/python2.7/dist packages/selenium/webdriver/firefox/webdriver.py”第183行中的“文件”,第1行。退出(self)文件“/usr/local/lib/python2.7/dist packages/selenium/webdr

  • 我是Spring的新人&尝试通过创建小项目来增强我的技能。在我的新应用程序中,我想对accountNumber进行唯一性检查,不幸的是我没有成功。我想应用isPresent()方法,但当我调用它时,它并不存在。如果我得到帮助,我会很感激。 AccountrePository

  • 问题内容: 我有ConcurrentLinkedDeque,它用于同步push / pop元素,还有一些异步任务,这些任务正在从堆栈中获取一个元素,如果该元素具有邻居,则会将其推入堆栈。 示例代码: 我想在while循环中有另外一条语句来回答问题-“执行程序中的任何任务都在工作?” 问题答案: 如果使用,没有一种干净的方法来检查所有Runnable是否都已完成。除非您在Runnable本身中构建了

  • 本文向大家介绍如何检查PHP会话是否已经开始?,包括了如何检查PHP会话是否已经开始?的使用技巧和注意事项,需要的朋友参考一下 在PHP中,我们利用一个内置函数session_start()来启动会话。但是,PHP脚本中面临的问题是,如果我们多次执行它会引发错误。因此,在这里我们将学习如何在不调用session_start()函数两次的情况下检查会话是否启动。 有两种方法可以解决此问题。 对于低于