1

私の質問は、こちらの質問と非常によく似ていますが、キャッチによる解決策がうまく機能しませんでした。

問題: マルチプロセッシングを使用してファイルを並列処理しています。約 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

問題は、プロセスの開始を確認でき、すべてのアイテムが処理されていることを確認できることです。ただし、プロセスが再結合しない場合があります。確認すると、親プロセスしかありませんが、何かを待っているかのようにアイドル状態です。子プロセスはありませんが、print ステートメントが表示されないため、join が呼び出されたとは思いません。

私の仮説は、これは多くの壊れたフレームがあるビデオで発生するというものです。ただし、このエラーはめったに発生しないため、再現するのは少し困難です。

編集:コードは現在有効である必要があります。このエラーを再現できるファイルを探しています。

4

0 に答える 0