python - 将队列传递给线程池 - Python

标签 python multithreading queue pool

使用带有列表和队列的池感到困惑。我收到错误: TypeError: 'int' object is not iterable 当传递 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()

最佳答案

Queue 类没有实现可迭代协议(protocol)。您需要提供自己的队列实现。这是一个例子:

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 方法。

关于python - 将队列传递给线程池 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35204854/

相关文章:

python - 如何在 Mac 上成功安装 OpenPYXL?

c# - 如何在单独的线程中加载多个 3D 几何图形而不会遇到线程所有权问题?

java - 重写通用 equals 方法

MongoDB 在压力下崩溃了

python - 如何让pyenv找到已安装的python版本

python - 是否可以在 Heroku dynos 上刷新内存?

python - python 3.6 multiprocessing.Pool()开始使用Windows的速度非常慢

c++ - 如何安全终止QT中不同线程上运行的对象

Java - 如何知道线程何时等待?

c++ - 在 C++ 中使用 vector 实现简单的优先级队列