2017-07-14 5 views
0

私はメッセージを送ることができる連続して実行されているpythonスクリプトを持っています。それはメッセージの内容を取り、いくつかのAPIで検索を実行し、その検索結果から返信します。現在、私はasync/awaitを使用していますが、これは動作していますが、何が起こっているかは、メッセージがすでに動作している間にメッセージを受信すると、メッセージを開始するまで待っています。それが受け取ったもの。Python Multiprocess with I/O

私は一度に複数のメッセージを処理できるように設定したいと思っています。待ち時間の大半はAPIが応答するのを待っているからです。マルチプロセッシングは私がここで使用すべきものですか?もしそうなら、メッセージが追加されるまでマルチプロセッシング機能をアイドル状態にしてから、そのメッセージをマルチプロセッシング機能に送り出す方法があります。私はキューを使用しなければならないようですが、ドキュメンテーションの大部分は、キューが終わったらすぐに処理を終了します。必要なことの1つは、特定の量のプロセス(たとえば4つのプロセス)があり、4つ以上のメッセージがある場合、余分なメッセージを格納し、解放された次のプロセスに追加することです。このような

何か:(本当に悪い擬似コード)

def runOnMessageReceive(message) 
    <run a regex here and extract the text i want to search for> 
    addToSearchQueue(text) 

def addToSearchQueue(text) 
    <here is where it would add it to the waiting queue and run it when it has an 
    open process> 
    process.run(searchAndPrint(text)) 

def searchAndPrint(info): 
    reply = Module.searchOnlineAPI(info) 
    Module.replyToMessage(reply) 

おかげ

答えて

0

あなたはかなり正確に "ブロッキング" されたものを見つけるために試してみてください。 asyncioのポイントはまさにあなたが望むもので、別のものを待っている間に保留中のタスクをブロックしないようにします。マルチプロセッシングやマルチスレッド化はここに行く方法ではないようです。 asyncioの適切な使用は、この種のユースケースのためのマルチプロセッシングよりも桁違いに優れています。何かがハングアップすると、asyncio(ブロッキング関数の呼び出しなど)を誤って使用しているか、メッセージキューのQoSによって制限されています(おそらく設定可能です)。

+0

あなたは、asyncioを使って複数のメッセージを同時に処理できることを言いますか?これには限界がありますか?アプリケーションはまったくぶら下がっていないため、メッセージを処理している間もメッセージを受信して​​いることを示しますが、最初のメッセージが処理されるまでは2番目のメッセージの処理が開始されません。 – sbeyeler

+0

理想的なプロジェクトの流れは、Pythonスクリプトがメッセージを受け取るたびに、APIから情報を受け取ってメッセージにフォーマットし、そのメッセージを送信してタスクを終了させるタスクを生成することです。私はsearchAndReplyタスクが開始された後、メインプログラムに戻る情報を返すことはありません。 Asyncioはまだ私がこれに使用すべきものですか?私にとっては、メインプログラムとは別の別のプロセスを開始する方が直感的ですが、私はAsnycioの動作を実際に理解していないので、既にそれを行っている可能性があります。 – sbeyeler

+0

あなたの仕事が(私が理解しているところからそうであるように思われる)ほとんどの時間を待っているとすれば、asyncioはより適合します。スレッド化または処理は、一般にCPUを集中的に使用する場合に適しています。キュー内でメッセージを受け取るたびに、 'create_task'したいと思うかもしれません。 'create_task'はあなたがさらなるメッセージを消費することを阻止しません(新しいスレッドの開始と同様ですが、そうでない場合を除きます)。 'onMessage'で' await'しないでください。また、[asyncio 'Queue'実装](https://docs.python.org/3/library/asyncio-queue.html)を見てみることもできます。 – user1527491