2

Web からリアルタイムの市場データを頻繁に取得し、そのデータを MySQL データベースに格納する Web バックエンドに取り組んでいます。

現在、メインスレッドでタスクを Queue オブジェクトにプッシュしています。次に、そのキューから読み取る約 20 のスレッドがあり、タスクが利用可能な場合、それらはそれを実行します。

残念ながら、私はパフォーマンスの問題に直面しており、多くの調査を行った後、決心できません。

私が見ているように、私には 3 つのオプションがあります。Celery のようなもので分散タスク アプローチを採用する必要がありますか? GIL の問題を回避するには、JPython または IronPython に切り替える必要がありますか? それとも、処理を使用してスレッドの代わりに別のプロセスを生成する必要がありますか? 後者なら何工程くらいがいいの?優れたマルチプロセス プロデューサー/コンシューマー デザインとは?

ありがとう!

4

2 に答える 2

1

まず、コードをプロファイリングして、パフォーマンスのボトルネックになっているものを特定します。

各スレッドが MySQL データベースに頻繁に書き込みを行っている場合、問題はディスク I/O である可能性があります。この場合、インメモリ データベースの使用を検討し、定期的にディスクに書き込む必要があります。

CPU パフォーマンスが制限要因であることがわかった場合は、multiprocessingモジュールの代わりにモジュールを使用することを検討してthreadingください。オブジェクトを使用しmultiprocessing.Queueてタスクをプッシュします。また、通信の粒度によってパフォーマンスが低下しないように、タスクが各コアをしばらくビジー状態に保つのに十分な大きさであることを確認してください。現在 を使用している場合はthreading、 に切り替えるmultiprocessingのが今のところ最も簡単な方法です。

于 2012-05-24T18:33:21.863 に答える
1

おそらく、イベント駆動型アプローチを使用し、twisted (python) やnode.js (javascript) などのイベント駆動型フレームワークを使用する必要があります。たとえば、このフレームワークは UNIX ドメイン ソケットを利用するため、コンシューマーはいくつかのポートでリッスンします。 、イベント ジェネレーター オブジェクトがすべての情報をコンシューマーにプッシュするため、コンシューマーはキューに何かがあるかどうかを毎回確認する必要がありません。

于 2012-05-24T18:34:23.340 に答える