python多处理从多处理队列访问数据而不读取所有数据

时间:2014-04-10 02:24:43

标签: python multiprocessing python-3.3

我有一个迭代器,它包含大量数据(大于内存)我希望能够对这些数据执行一些操作。为了快速完成这项工作,我正在使用多处理模块。

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

1 个答案:

答案 0 :(得分:1)

我相信你的工人应该受到责备。它只做一件事然后就死了。尝试:

def worker(self, queue):
    while True:
        tweet = queue.get()
        self.append(tweet)

(我会看一下Pool)