Python 多处理队列,用于获取要为进程处理的数据
我有一个需要提取的文件名列表,我有一个函数可以提取这些文件。由于它主要是使用CPU的任务,所以最好在多个进程之间生成它,以利用多个CPU 现在,我的代码如下所示:Python 多处理队列,用于获取要为进程处理的数据,python,multiprocessing,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 = spli
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()
def unpack(queue):
while queue.not_empty():
f = queue.get()
Archive(f).extractall('\\path\\to\\destination\\')
但是要处理的文件在大小上有很大的不同。有些文件为1KB,大多数大约为300KB,少数文件约为1.5Gb
因此,我的方法并不完美:5个进程非常快速地处理它们的部分文件并退出,而其他三个进程正在努力处理一些大文件和一堆小文件。因此,最好不要让快速进程退出,而是处理这些小文件
在这里使用一些带有文件列表的队列会更好,它可以正确地处理多个进程。我的解包函数如下所示:
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()
def unpack(queue):
while queue.not_empty():
f = queue.get()
Archive(f).extractall('\\path\\to\\destination\\')
但是我在多处理模块中找不到这个队列。唯一的multiprocessing.Queue不接受要初始化的对象列表,看起来它应该用作进程推送数据的容器,而不是从中获取数据的容器
因此,我的问题很简单,可能很愚蠢(我是多处理机新手),但我应该使用哪个对象/类作为包含要处理的数据的容器?我建议使用一个
它已经处理了块大小、工作进程的重用和进程处理逻辑