将队列传递给Threadpool - Python

时间:2016-02-04 15:22:14

标签: python multithreading queue pool

使用池与列表与队列混淆。我得到错误:TypeError:'int'对象在传递q.get代替列表时是不可迭代的。希望这只是一个疏忽。

from multiprocessing.dummy import Pool 
import Queue

numbers = [11,12,13,14]

def printNumbers(n):
    print n

q = Queue.Queue()    
for i in (1,2,3,4):
   q.put(i)

#multiThread with list numbers
pool = Pool(4) 
results = pool.map(printNumbers, numbers)
pool.close() 
pool.join() 

#multiThread with queue
pool2 = Pool(4) 
results2 = pool2.map(printNumbers, q.get())
pool2.close() 
pool2.join()

1 个答案:

答案 0 :(得分:2)

Queue类不实现可迭代协议。您需要提供自己的Queue实现。这是一个例子:

class IterableQueue(Queue.Queue):

    _sentinel = object()

    def __init__(self, maxsize=0):
        Queue.Queue.__init__(self, maxsize)
        self.put(self._sentinel)

    def __iter__(self):
        return iter(self.get, self._sentinel)

您可以在https://docs.python.org/2/library/functions.html#iter

阅读__iter__的详细信息以及如何使用哨兵

请注意,如果您希望队列在空白时阻塞,直到添加更多项目,那么我的示例队列就不是​​您想要的了。为此,请参阅Python iterable Queue

但是,当我将该版本与您的代码一起使用时,它永远不会终止。要使用那个,你需要重新构造一下,这样当你知道你没有更多的项目可以添加到队列时,你可以调用close方法。