3

私はスレッドやプロセスはどちらを使うべきですか?

while(true): 
    functionA 
    functionB 

ラズベリーパイにPythonでコードを書いています関数Aは、基本的にPNG形式の画像をキャプチャするコマンドです。私はそれを阻止機能にしたくありません。私は自分のコードが関数Bに進むことを望んでいますが、関数Aは画像をキャプチャして次の実行のためにデータを準備しています。

スレッドやプロセスを使用するかどうか混乱します。

スレッドを使用する必要がある場合、いつ終了しますか? 関数Aの実行が完了してから一度停止しますか?その場合、このスレッドを開始するたびにstartメソッドを呼び出す必要があります。 または、プロセスを使用する必要がありますが、プロセスがいつ終了するのかについては、どのように意味するのでしょうか。

+0

プロセスではなくスレッドを使用します。 –

+0

スレッドとプロセスの違いについてはっきりさせましょう。非公式の定義:スレッドは、プロセスの一部として実行される一連のコードです。プロセスには、すべて同じプロセス・スペースと仮想メモリー・スペースを共有する多数のスレッドが含まれている場合があります。スレッドは、必ずしも親プロセスを終了させることなく、完了時に終了します(そして終了します)。何の音が聞こえるかでは、functionAを同期して実行するためにスレッドを使うべきです。新しいプロセスは確かにより多くのリソースを取るでしょう。 –

答えて

2

スレッドとプロセスの違いについてはっきりさせましょう。非公式の定義:スレッドは、プロセスの一部として実行される一連のコードです。プロセスには、すべて同じプロセス・スペースと仮想メモリー・スペースを共有する多数のスレッドが含まれている場合があります。スレッドは、必ずしも親プロセスを終了させることなく、完了時に終了します(そして終了します)。何の音が聞こえるかでは、functionAを同期して実行するためにスレッドを使うべきです。新しいプロセスは、より多くのリソースと不要なサウンドを確実に取り込みます。また、スレッドが完全に実行を完了した後でコードを再実行する必要がある場合は、スレッドを再度作成する必要があります。一方、新しいスレッド内で実行するコードを、実行中のタスクに適していると思われる場合は、無期限にループするように書くことができます。

+1

彼は 'while'ループで関数を実行できるので、スレッドを再度作成する必要はありません。 –

+0

これは本当です。実行が完全に終了しない限り、必ずしもスレッドを再作成する必要はありません。しかし、これはスレッドの制御フローに依存します。 –

+1

@ CaitLan Jenner私が思っていたのは、この 'def Mythread():'のようなものでしたし、 'whileループ'では 'Mythread.start()'を追加して毎回新しいスレッドを作成するようにしました –

2

CaitLANの答えは重要な詳細のカップルを残し:

1)プロセス間の通信は、スレッド間の通信よりもはるか困難です。スレッドはすべて同じアドレス空間に存在するので、スレッド間の通信はスレッドAが変数を書き込み、スレッドBがそれを読み込むほど簡単です。

プロセスは、共有パイプ、共有ファイル、ネットワーク接続、またはオペレーティングシステムによって提供される他の手段によって互いに通信します。プロセス間でオブジェクトを渡したいのであれば、 "マーシャリング"と "アンマーシャリング"(別名 "シリアライズ"、 "ピクリング"など)の手段を提供するのは、あなた次第です。オブジェクト。

*「ほぼ」に隠れている悪魔は、ここで説明したいよりも複雑です。 Googleの「スレッド同期」や「メモリの可視性」

2)安全にプロセスを強制終了できます。あなたはスレッドを殺すことについて決して確信することはできません。あなたのfunctionAが深刻な問題を起こす可能性がある場合は、プログラム内のスレッドで実行されている場合はプログラム全体を停止しますが、functionAが別のPythonプロセスとして実行されている場合はプログラムが回復する可能性があります。

*このスペースにはあまりにも多くのことを書いてください。

関連する問題