将队列传递给线程池 - Python
Passing Queue to Threadpool - Python
混淆使用带列表的池和队列。我收到错误:TypeError: 'int' object is not iterable when passing q.get in place of a list.希望这只是一个疏忽。
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()
队列class没有实现可迭代协议。您需要提供自己的 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)
您可以阅读 __iter__
的详细信息以及如何使用哨兵 https://docs.python.org/2/library/functions.html#iter
请注意,如果您想要一个在添加更多项目之前会在空时阻塞的队列,那么我的示例队列不是您想要的。为此,请参阅 Python iterable Queue
然而,当我将该版本与您的代码一起使用时,它从未终止。要使用它,您需要稍微调整一下结构,以便在您知道没有更多项目可添加到队列时可以调用 close 方法。
混淆使用带列表的池和队列。我收到错误:TypeError: 'int' object is not iterable when passing q.get in place of a list.希望这只是一个疏忽。
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()
队列class没有实现可迭代协议。您需要提供自己的 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)
您可以阅读 __iter__
的详细信息以及如何使用哨兵 https://docs.python.org/2/library/functions.html#iter
请注意,如果您想要一个在添加更多项目之前会在空时阻塞的队列,那么我的示例队列不是您想要的。为此,请参阅 Python iterable Queue
然而,当我将该版本与您的代码一起使用时,它从未终止。要使用它,您需要稍微调整一下结构,以便在您知道没有更多项目可添加到队列时可以调用 close 方法。