【问题标题】:Python - Best practices to queue / dequeue threadsPython - 排队/出列线程的最佳实践
【发布时间】:2011-10-08 09:08:22
【问题描述】:

我有一个最多可以包含 4 个排队对象的队列。这些对象是运行 Web 服务请求的线程。螺纹部分没问题。 我遵循了许多关于用于填充和输出队列对象的消费者和生产者线程的教程。 我的问题是关于消费者部分。在所有这些教程和关于 python 文档中,我发现从队列中堆积对象的唯一方法是:

while len(requltArray) < amountOfThreads:
    thread = q.get(True)
    thread.join()

想象一下 q.get(True) 堆出一个带有无效 Web 服务请求的线程。想象一下这个线程必须等待 urllib 超时结束。我的消费者将被阻止几秒钟。由于我的队列被限制为 4 个线程,而其他 3 个线程可能已经结束,我会浪费时间直到消费者可以继续堆积(生产者可以填满队列)。

有什么方法或众所周知的设计模式可以避免这种浪费时间吗?

感谢您的帮助

【问题讨论】:

  • 我对你的目标感到困惑——你想清理三个完成的线程,然后等到 4 号吗?或者你是在问如果完成时间超过一定时间,你怎么能杀死一个人?如果是前者,the doc有一个很好的答案——调用join(1.0)(也就是这里超时1秒),然后是is_alive()。如果是后者,则没有简单的方法可以做到这一点。
  • 让线程排队是一件很奇怪的事情。大多数人都有许多工作线程从一个公共队列中读取,并将工作线程的请求排入队列以进行处理。为什么不遵循其他人的设计模式,让四个线程读取请求队列呢?为什么会倒退?
  • - Nate:事实上它是第一个,感谢 join(1.0) 提示 - S.Lott:您的设计模式接缝比我的要好得多。我对常见的设计模式不太熟悉。我会用它。你应该发布一个完整的答案来指导初学者(比如我)
  • @kheraud:“你应该发布一个完整的答案来指导初学者”。我不认为我可以。我不明白你想做什么。我只看到这个问题,它做了一些奇怪和不完整的事情。也许你应该解释你正在生产什么,你正在消费什么以及你想要进行什么处理。作为一个单独的问题。
  • @Nate:好的,我明白了。我的真正目标比我在这篇文章中描述的更复杂。我正在研究另一个描述我的目标和我选择的设计的线程。感谢您的帮助

标签: python multithreading architecture queue


【解决方案1】:

也许你可以使用conditions

假设您想将一个新线程放入队列中,但它已满。然后你可以 wait() 获取条件对象(伪代码):

condition.acquire()
while not queue.has_free_place():
    condition.wait()
add_new_thread_to_queue()
condition.release()

在您的队列线程中,您可以在执行结束时放置如下代码:

condition.acquire()
remove_myself_from_queue()
condition.notify()
condition.release()

【讨论】:

  • 好提示,我不知道条件(一种锁定)。但我更喜欢 S.Lott 提出的推荐设计模式
猜你喜欢
  • 1970-01-01
  • 2014-06-04
  • 2010-10-14
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多