我的问题与这里的问题非常相似,除了捕获的解决方案对我来说不太有效。
问题:我正在使用多处理来并行处理文件。大约 97%,它有效。但是,有时,父进程会永远空闲,CPU 使用率显示为 0。
这是我的代码的简化版本
from PIL import Image
import imageio
from multiprocessing import Process, Manager
def split_ranges(min_n, max_n, chunks=4):
chunksize = ((max_n - min_n) / chunks) + 1
return [range(x, min(max_n-1, x+chunksize)) for x in range(min_n, max_n, chunksize)]
def handle_file(file_list, vid, main_array):
for index in file_list:
try:
#Do Stuff
valid_frame = Image.fromarray(vid.get_data(index))
main_array[index] = 1
except:
main_array[index] = 0
def main(file_path):
mp_manager = Manager()
vid = imageio.get_reader(file_path, 'ffmpeg')
num_frames = vid._meta['nframes'] - 1
list_collector = mp_manager.list(range(num_frames)) #initialize a list as the size of number of frames in the video
total_list = split_ranges(10, min(200, num_frames), 4) #some arbitrary numbers between 0 and num_frames of video
processes = []
file_readers = []
for split_list in total_list:
video = imageio.get_reader(file_path, 'ffmpeg')
proc = Process(target=handle_file, args=(split_list, video, list_collector))
print "Started Process" #Always gets printed
proc.Daemon = False
proc.start()
processes.append(proc)
file_readers.append(video)
for i, proc in enumerate(processes):
proc.join()
print "Join Process " + str(i) #Doesn't get printed
fd = file_readers[i]
fd.close()
return list_collector
问题是我可以看到进程正在启动,并且我可以看到所有项目都在处理中。但是,有时,进程不会重新加入。当我回来查看时,只有父进程在那里,但它处于空闲状态,就好像它在等待什么一样。没有任何子进程,但我不认为 join 被调用,因为我的 print 语句没有出现。
我的假设是,这发生在有很多断帧的视频上。但是,重现此错误有点困难,因为它很少发生。
编辑:代码现在应该有效。试图找到可以重现此错误的文件。