スキップしてメイン コンテンツに移動

投稿

1月, 2009の投稿を表示しています

Python: threadingでマルチコアCPUを有効に使う

動画変換などのCPU時間のかかる処理を複数コアで並列処理すれば効率的だという話。例えばIntelのCore 2 Duoの場合、常に2プロセス走っていればシングルの半分の時間で済む。というわけでPythonでやってみた。

Pythonではthreading.ThreadとBoundedSemaphoreを使って制御するのが楽そうだ。プロセスの実行はsubprocess.Popenを使う。

ここでは、複数のAVI動画ファイルをmencoderを使ってMPEGファイルに変換してみる。まず、Threadクラスを継承したMyThreadクラスを作る。また、BoundedSemaphoreで同時に実行するプロセス数を指定する。とりあえずコア数と同じ2とした。そして動画ファイル分だけMyThreadのインスタンスを作り実行する。これだけ。ちなみにセマフォではwith文を使っているがPythonのバージョンが2.5未満であればaquire/releaseに置き換えること。

実際にCore 2 Duoを積んだPCで6つの動画ファイルを変換したところ、1プロセスでは118秒かかったが2プロセス同時では60秒で済んだ。最近ではマルチコア、メニーコア全盛なのでこういった工夫は必要不可欠になってきている。

本エントリの最後にソースコードを示す。ファイル名をmy_thread.pyとすると、

my_thread.py *.avi

のように実行する。

#!/usr/bin/env python from __future__ import with_statement import sys, os, glob, subprocess, threading, time pool_sema = threading.BoundedSemaphore(2) class MyThread(threading.Thread): def __init__(self, filename): self.filename = filename threading.Thread.__init__(self) def run(self): with pool_sema: self.log = subprocess.Po…