我有一个迭代器,它包含大量数据(大于内存)我希望能够对这些数据执行一些操作。为了快速完成这项工作,我正在使用多处理模块。
def __init__(self, poolSize, spaceTimeTweetCollection=None):
super().__init__()
self.tagFreq = {}
if spaceTimeTweetCollection is not None:
q = Queue()
processes = [Process(target=self.worker, args=((q),)) for i in range(poolSize)]
for p in processes:
p.start()
for tweet in spaceTimeTweetCollection:
q.put(tweet)
for p in processes:
p.join()
目标是我创建一些监听队列的程序
def worker(self, queue):
tweet = queue.get()
self.append(tweet) #performs some actions on data
然后我遍历迭代器并将数据添加到队列中,因为worker方法中的queue.get()
阻止了工作人员在从队列中收到数据时应该开始对数据执行操作。
然而,每个处理器上的每个工作程序都运行一次就可以了!因此,如果poolSize为8,它将读取队列中的前8个项目,对8个不同的进程执行操作,然后它将完成!有谁知道为什么这是happerning?我在Windows上运行它。
编辑 我想提一下,甚至认为这是在一个类中完成的,该类在_ main _like中调用,所以
if __name__ == '__main__':
tweetDatabase = Database()
dataSet = tweetDatabase.read2dBoundingBox(boundaryBox)
freq = TweetCounter(8, dataSet) # this is where the multiprocessing is done
答案 0 :(得分:1)
我相信你的工人应该受到责备。它只做一件事然后就死了。尝试:
def worker(self, queue):
while True:
tweet = queue.get()
self.append(tweet)
(我会看一下Pool)