1

Pythonのマルチプロセッシングを使用して、ロックを使用せずに並行処理を実行したい(ロックはマルチプロセッシングの反対です)。Webリクエスト中に異なるリソースから複数のレポートを同時に作成したいからです(通常は約3秒かかりますがマルチプロセッシングを使用すると、0.5秒で実行できます)。

私の問題は、そのような機能をWebに公開し、10人のユーザーが同時に同じレポートを取得すると、突然60人のインタープリターが同時に開いてしまうことです(システムがクラッシュします)。これはマルチプロセッシングを使用した常識的な結果ですか、それともこの潜在的な悪夢を回避するためのトリックがありますか?

ありがとう

4

3 に答える 3

2

multiprocessネットワークアプリに同時実行性を追加するために使用しようとしている場合は、間違ったツリーを吠えています。リクエストごとにプロセスを作成している場合は、完全に間違ったツリーを吠えています。multiprocess(少なくとも並行性モデルとして)あなたが望むものではありません。

Twistedのような非同期ネットワークフレームワークが必要になる可能性は十分にあります。

于 2010-04-29T16:29:27.333 に答える
2

インスタンスが多すぎることを本当に心配している場合は、Semaphore オブジェクトで呼び出しを保護することを考えることができます。あなたが何をしているのか理解できれば、スレッド化されたセマフォ オブジェクトを使用できます。

from threading import Semaphore
sem = Semaphore(10)
with sem:
    make_multiprocessing_call()

make_multiprocessing_call()それ自体がクリーンアップされると思います。

このようにして、Python の 10 個の「余分な」インスタンスのみが開かれます。別の要求が発生した場合、前の要求が完了するまで待機する必要があります。残念ながら、これは「キュー」順ではありません...または特定の順序ではありません。

それが役立つことを願っています

于 2010-04-29T17:33:58.280 に答える
1

複数のエージェントがソースに書き込んでいる場合にのみ、ロックが必要になります。アクセスしているだけの場合、ロックは必要ありません(そして、あなたが言ったように、マルチプロセッシングの目的を無効にします)。

それでシステムがクラッシュしてもよろしいですか?CGIを使用するWebサーバーでは、各リクエストが新しいプロセスを生成するため、システムをクラッシュさせない数千の同時プロセス(Pythonではwsgiを使用し、これを回避する必要があります)を見るのは珍しいことではありません。

理論をテストして(10回の同時アクセスを作成するのは難しくないはずです)、サーバーが実際にクラッシュするかどうかを確認することをお勧めします。

于 2010-04-29T16:28:53.137 に答える