多处理队列以获取处理进程的数据

时间:2017-05-22 12:32:58

标签: python multiprocessing

我有一个列表,其中包含需要提取的文件的文件名,我有一个提取这些文件的函数。由于它主要是CPU使用任务,因此在多个进程之间生成它以利用多个CPU是很好的。

现在我的代码看起来像这样:

import multiprocessing

def unpack(files):
  for f in files:
     Archive(f).extractall('\\path\\to\\destination\\')


n_cpu = multiprocessing.cpu_count()
chunks = split(cabs_to_unpack, n_cpu) # just splits array into n equal chunks

for i in range(n_cpu):
    p = Process(target=unpack, args=(chunks[i],))
    p.start()
    p.join()

但要处理的文件大小差别很大。一些文件是1 kb,大多数是大约300 kb,一些文件大约是1.5Gb。

所以我的方法并不完美:5个进程处理他们的部分文件非常快速和退出,其他三个进程正在努力处理一些大文件和一堆小文件。因此,让快速进程不退出也很好,但也要处理这些小文件。

看起来好像在这里使用一些带有文件列表的Queue,这可以在多个进程中正确工作。我的解包功能看起来像这样:

def unpack(queue):
  while queue.not_empty():
     f = queue.get()
     Archive(f).extractall('\\path\\to\\destination\\')

但我无法在多处理模块中找到此队列。唯一的多处理.Queue没有对象列表进行初始化,看起来它应该被用作进程推送数据的容器,而不是用作从中获取数据的容器。

所以我的问题很简单,也许是愚蠢的(我是多处理的新手),但是我应该将哪个对象/类用作要处理数据的容器?

1 个答案:

答案 0 :(得分:0)

我建议multiprocessing.Pool

from multiprocessing import Pool

def unpack(file_path):
    Archive(file_path).extractall('\\path\\to\\destination\\')

pool = Pool()
pool.map(unpack, list_of_files)

它已经处理了块大小,重用工作进程和进程处理逻辑。