我有一个列表,其中包含需要提取的文件的文件名,我有一个提取这些文件的函数。由于它主要是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没有对象列表进行初始化,看起来它应该被用作进程推送数据的容器,而不是用作从中获取数据的容器。
所以我的问题很简单,也许是愚蠢的(我是多处理的新手),但是我应该将哪个对象/类用作要处理数据的容器?
答案 0 :(得分:0)
from multiprocessing import Pool
def unpack(file_path):
Archive(file_path).extractall('\\path\\to\\destination\\')
pool = Pool()
pool.map(unpack, list_of_files)
它已经处理了块大小,重用工作进程和进程处理逻辑。