Python - 排队/出列线程的最佳实践

时间:2011-07-19 09:44:20

标签: python multithreading architecture queue

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

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

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

有没有办法或众所周知的设计模式可以避免浪费时间?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

也许你可以使用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()