如何在不使用for循环的情况下从多线程队列中删除大量元素

时间:2016-02-24 13:22:15

标签: python python-2.7 python-3.x python-multithreading

假设我有一个包含300个元素的多线程队列myQueue。我可以删除100个最老的,而不必在for循环中反复调用myQueue.get() 100次吗?

注意

试图避免使用for循环似乎是一个奇怪的目标,但我正在寻找提高性能和增加代码简单性的方法。这就是为什么我希望能够以非迭代方式处理队列(删除元素)的原因。

1 个答案:

答案 0 :(得分:0)

我发现这样的东西起作用,似乎它并没有违反任何线程安全规则。

实施例

import Queue

myQueue = Queue.Queue()
for i in range(1,100):
    myQueue.put(i)
amount = [i for i in range(1,10)]
map(myQueue.get, amount)  # that will result in removing the 10 oldest elements

这相当于使用for循环,但循环代码在C中实现,可以带来更好的性能。

另一种方法是使用map()内置函数的并行等价物。这将划分必须在循环中处理的不同进程中的块

import multiprocessing
pool = multiprocessing.Pool()
pool.map(myQueue.get, range(1, 10))