2009-08-26 8 views
0

私は新しいサブディレクトリのディレクトリを監視し、ループ内の各サブディレクトリに対して動作するPythonスクリプトを作成しました。これらのサブディレクトリを作成する外部プロセスがあります。各サブディレクトリの中には、テキストファイルと多数のイメージがあります。各画像のテキストファイルには1つのレコード(行)があります。私のスクリプトは、テキストファイルをスキャンし、いくつかの外部プログラムを呼び出し、1つは空のイメージ(カスタムexe)を検出し、次にイメージをサイズ変更して変換する "mogrify"の呼び出しと最後に7への呼び出しを行います-zip変換されたイメージとテキストファイルをすべて1つのアーカイブに貼り付けます。Windowsでのバルクファイル/変換操作のためのPythonマルチ処理

スクリプトは正常に動作しますが、現在は順次実行されています。各サブディレクトリを一度に1つずつループします。これはデュアルCPUマシン(合計8コア)で実行されているので、これはいくつかのマルチプロセッシングを行う良い機会になると私には思われます。

特定のサブディレクトリの処理は、他の処理とは無関係です。これらは独立して処理されています。

現在、私はos.listdir()の呼び出しを使用してサブディレクトリのリストを作成し、そのリストをループしています。私は、サブディレクトリごとのコード(コンバージョンなど)をすべて別の関数に移動して、それぞれのサブディレクトリを処理する別々のプロセスを作成することができると考えています。私はPythonに少し新しかったので、そのようなマルチプロセッシングにアプローチする方法についてのいくつかの提案が評価されるでしょう。私はPython 2.6を実行しているVista x64を使用しています。

答えて

0

私は、このデザインが同時性の恩恵を受けているように聞こえることに同意します。 the multiprocessing moduleをご覧ください。また、the threading moduleを見て速度を比較することもできます。マルチプロセッシングとスレッド化の利点を得るために必要なコアの数を正確に把握することは難しく、8つのコアはスレッド化が高速になる範囲(GILにもかかわらず)に十分対応しています。

私の最大の推奨は、可能な限りプロセス間の相互作用を完全に避けることです。 1つの中央スレッドで、プロセスの作成をトリガーするイベントを探します(私はそれがサブディレクトリーの作成であると推測しています)。そして、サブディレクトリーを処理するプロセスを生成します。そこから、生成されたプロセスは他のプロセスとやりとりするべきではありません。あなたの説明から、これが可能でなければならないようです。

最後に、Python 3.0に移動するための励ましの言葉を追加したいと思います。 2.xのままでいるという話がたくさんありますが、3.0ではいくつかの改善が行われています。そして、ますます多くの人々がPython 3.0への移行を開始するにつれて、ツールを入手して2.xをサポートすることは難しくなります。

+0

お薦めいただきありがとうございます。プロセスは独立しています。他の唯一の問題はロギングです。私は処理のエラーを報告するためにファイルハンドラにログを書きます。マルチプロセスロギングが複雑になっているようです。 私が3.0に移行する際に見る唯一の問題は、MS SQL Serverに接続するためにpyodbcを使用していることです。このモジュールは、現在最大2.6までしかサポートしていません。 –

+1

ロギングに関して、非常に基本的な解決策は、プロセスごとに別々のロギングを行い、次にログを併合することです。あなたはsqlserverに言及して以来、データベースを使用することができますが、それはむしろ自然である可能性があります(アイデアを素早く試すためにはsqliteがあります)。 – Francesco

+0

ログにSQLiteを使用することの提案に+1してください。 – Imagist