将队列传递给线程池-Python

将队列传递给线程池-Python,python,multithreading,queue,pool,Python,Multithreading,Queue,Pool,将池与列表与队列一起使用时感到困惑。我得到一个错误:TypeError:int对象在传递q.get代替列表时不可iterable。希望这只是一个疏忽 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) #multiT

将池与列表与队列一起使用时感到困惑。我得到一个错误:TypeError:int对象在传递q.get代替列表时不可iterable。希望这只是一个疏忽

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()

队列类未实现iterable协议。您需要提供自己的队列实现,这样做。以下是一个例子:

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)
您可以阅读
\uuuuu iter\uuuuu
的详细信息以及如何在

请注意,我的示例队列不是您想要的,如果您想要一个在添加更多项目之前将在空时阻塞的队列。为此,请参见


然而,当我将该版本与您的代码一起使用时,它从未终止。要使用该方法,您需要重新构造一点,以便在知道没有更多项目要添加到队列时调用close方法。

此时为什么要使用队列。顺便说一句,请注意线程和多进程队列的区别,因为随着线程的退出,它将不断增长(现在研究线程与多进程)。最终目标是一个脚本,它遍历一个目录,创建一个在pycurl命令中使用的fileInfo变量,然后输出到日志。现在按顺序->解析行走,抓取下一个文件,从根路径提取信息,通过curl上传,输出到日志pass/fail。在curl上遇到巨大的时间延迟,因此使用threads Future-goal->Parse walk,使用文件信息填充队列->使用多个线程从队列中拉出执行curl命令->使用success/fail填充日志队列->函数从日志队列中拉出以写入