前提・実現したいこと
自宅にあるNASからスマホで音楽を聞くために、wavファイルをmp3ファイルに変換するPythonスクリプトを作っています。
はじめは逐次的に変換するコードを書いていましたが、非常に時間がかかるので並列処理に変えようとしています。
発生している問題・エラーメッセージ
最後まで変換されずに途中で終わってしまいます。
どの曲を変換しているかログを出すようにして実行したところ、マルチな子プロセスが変換処理を始めたログがでて数十秒後に何事もなくメインプロセスが終了します。
変換終了ログも出ていません。
期待値は「すべてのwavファイルがmp3ファイルに変換されること」です。
該当のソースコード
python
1# transform_multiprocess.py 2import os 3import glob 4import pydub 5import multiprocessing 6from datetime import datetime 7 8 9# ファイル名をキューに登録する 10def produce(queue, wavpath_list): 11 for i in range(len(wavpath_list)): 12 wavpath = wavpath_list[i] 13 writelog(f'<Enqueue> {wavpath}') 14 queue.put(wavpath) 15 16 17# キューからファイル名を取り出して変換 18def consume(queue): 19 while not queue.empty(): 20 print(f'queue.isempty = {queue.empty()}') 21 wavpath = queue.get() 22 writelog(f'<Dequeue> {wavpath}') 23 trans_wav_to_mp3(wavpath) 24 25 26# wavからmp3に変換する 27def trans_wav_to_mp3(wavpath): 28 mp3path = wavpath.replace('.wav', '.mp3') 29 writelog(f'Start transforming: {wavpath}') 30 sound = pydub.AudioSegment.from_wav(wavpath) 31 sound.export(mp3path, format='mp3') 32 writelog(f'Finish transforming: {wavpath} -> {mp3path}') 33 del sound 34 35 36# ログファイル書き出し 37def writelog(log): 38 dt_now = datetime.now().strftime('%Y/%m/%d %H:%M:%S') 39 pid = os.getpid() 40 writelog(f'<Enqueue> {wavpath}') 41 queue.put(wavpath) 42 43 44# メイン 45def main(): 46 # wavファイルのリスト 47 wavpath_list = glob.glob( 48 'NAS用HDDのマウントポイント/*.wav', 49 recursive=True 50 ) 51 # ファイル名を格納するキュー 52 queue = multiprocessing.SimpleQueue() 53 54 # プロセス生成 55 p = multiprocessing.Process(target=produce, args=(queue, wavpath_list)) 56 c0 = multiprocessing.Process(target=consume, args=(queue,)) 57 c1 = multiprocessing.Process(target=consume, args=(queue,)) 58 c2 = multiprocessing.Process(target=consume, args=(queue,)) 59 c3 = multiprocessing.Process(target=consume, args=(queue,)) 60 61 # プロセス開始 62 p.start() 63 c0.start() 64 c1.start() 65 c2.start() 66 c3.start() 67 68 # プロセス終了待ち合わせ 69 p.join() 70 c0.join() 71 c1.join() 72 c2.join() 73 c3.join() 74 75 76# main 77if __name__ == '__main__': 78 main()
試したこと
プロセス数をいろいろ変えてみましたが、変わらずでした。
補足情報
Python 3.7.3
OS:Raspbian Buster
(あまり質問を投げたことがないので、情報不足がありましたらすみません...)
回答2件
あなたの回答
tips
プレビュー