2016-10-24 2 views
1

私は特定のデータを収集して処理する小さなプログラムに取り組んでいます。現在、プログラムは常にサーバー上で実行され、ディスクにデータが格納されます。たまには、保存されたデータを読み込んで処理し、ソートし、新しい場所に保存し、古いデータファイルをクリアする別のプログラムを実行します。Pythonでは、これにスレッドを使うべきでしょうか?

私はスレッドについて学んだことはありませんでしたが、このような使い方は良いですか?スレッディングがうまくいくと思うなら、データを保持するキューを設定し、データをキューから取り出して準備ができたときに処理できる別のスレッドを用意することができます。キューが満杯の場合、thread1は少しスリープ状態になる可能性があります。空の場合、スレッド2は少し眠ることができます

これは、ディスクの書き込みを減らし、ディスクの読み込みを取り除き、データを並べて処理することで時間を節約します。

これは間違いありませんか?私はシニアCSの学生であり、スレッドは一度も出てこなかった(確かにちょっと変だ?)。私は、スレッドを使用することでヒント/知識/アドバイスをお寄せいただきたいと思います。

ありがとうございます!

+0

タイミングを気にする必要があります。さもなければ、彼らは空になって寝るだけです。あなたはスレッドを使用することができますが、それがあなたに役立つかどうかわからない1つのワークフローだと考えています。あなたはパフォーマンスの問題にぶつかっていますか? – DejaVuSansMono

+0

パフォーマンスに関する問題はありません。私は主に学習面から見ています。私は、複数のスレッドを使用することについて学びたいだけでなく、それらを効果的に使用することを学びたいだけです。 – Sanders0492

+0

もちろん、データがディスクに保存されるまでは、予期しないエラーや電気的なブラックアウトの場合に失われる危険性があります。 – Cosinux

答えて

3

これは、何らかの並列処理が役立つような状況に似ています。しかし、これはPythonであるため、実際にスレッドを使用したくないかもしれません。 Pythonは、標準的な実装では、グローバルインタープリタロックと呼ばれるものを持っています。事実、ガベージコレクタを動作させるためには、Pythonプログラムの1つのスレッドだけがいつでもPythonコードを実行できます(Cで直接記述されたモジュール、またはディスクIOやデータベースクエリなどの外部操作はPythonコード"この目的のために、あなたはPythonからそれらを呼び出すでしょう)。

このため、Pythonコードが、プログラムの非Python部分または外部ソースからの応答を待つのにかなりの時間を費やしているのであれば、一般的にPythonでのスレッド化は良い考えです。データの収集や処理がPython以外で行われている場合(データベースやWebサイトから収集し、numpyで処理するなど)、それは妥当かもしれません。あなたのコードがこのような状況で十分でない場合、プログラムはスレッド間の切り替え時間を無駄にしてしまいます(2つのスレッドが両方ともPythonコードで実行されているため、一度に1つしか実行されません)。

代わりにmultiprocessingモジュールを試してください。マルチプロセスのプロセス間で共有できるのは、明示的に共有するものだけです(スレッドはすべての状態を共有しますが、何かをロックするのを忘れたためスレッドが別のスレッドを破る可能性があるためです)。

また、subprocessを使用することもできます。効果的には、これは、データのバッチが終了するたびに、最初のプログラムが断続的に2番目のプログラムを再起動させることになります。

+0

ああ、私はサブプロセスのアイディアが好きです、ありがとう!また、一見価値のあるマルチプロセッシングサウンドもあります。データ収集部はウェブサイトをクロールしますが、皆さんと一緒にいます - マルチスレッドは最適なものではないようです。 データを収集した後、データを処理し、その結果を使用してデータの次のバッチを収集し、その後処理され、サイクルが継続します。彼らは完全に同期している必要はなく、オーバーラップを持つことができます。サブプロセスを使用し、数時間ごとに2番目のプログラムを実行することがあります。 ありがとう! – Sanders0492

関連する問題