ken1234566767
@ken1234566767

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

並列処理で定期的にフィードバックを行うループを作る方法

Q&A

Closed

解決したいこと

pythonで並列処理を書きたいと思っています。
処理Aと処理Bがあり、処理AはBよりも100倍くらい処理時間が遅いです。
今処理Bを無限ループさせている間にAを定期的に実行してAの処理結果をBにフィードバックさせたいです。

#こんなイメージ
B -> B -> B -> B -> B -> B-> B-> B
          │              │ 
A ────────┘ A ───────────┘A ────── 
#これが無限に続く

共有メモリにAの処理完了フラグを作って、「Aを実行する関数」と「処理完了フラグが立つまでBを無限ループする関数」を並列処理してjoinするのを無限に繰り返す、というやり方も考えたのですが、もっといい方法がすでにある気がしています。
もっと簡単なやり方があれば教えていただきたいです。

0

2Answer

処理Bをwhile True: ...で普通に無限ループさせつつ、100倍遅いとされる処理Aをmultiprocessingで処理させます。

multiprocessingである必要はなく、threadingでもconcurrent.futures.ProcessPoolExecutorでもお好きな方法でさばけば良いと思います。

フィードバックについては処理Aをクラス化するなりして、処理A終了後に処理Aのクラスプロパティから引っ張ってくるなどは思いつきます。或いはキューでプロセス間通信を行う。

並列処理してjoin

threadingなのかmultiprocessingなのかは分かりませんが、join()すると処理待ちが発生して無限ループが一時停止に陥ります。


その「やり方も考えた」コードがあれば何とか言い様はありますが、物が全くないのにこれ以上は応えられません。
それとPythonの並列処理についてよく学習なって下さい。

0Like

Comments

  1. @ken1234566767

    Questioner

    ありがとうございます
    Queueで変数伝達をやってみようと思います。

こんにちは。Pythonはほとんど使わないのですがC#での非同期プログラミングの経験があるため回答させて頂きます。

C#を使用する場合、ConcurrentQueueというスレッドセーフなキューを用意してスレッドAでEnqueueして、BではTryDequeueを繰り返し呼び出し、Bではデータが得られた時だけ処理するような方法が考えられます。

私は実際にプログラムを動かして試していないのですが、PythonのドキュメントにあるQueueクラスのputとgetでそれと近いことは出来るのではないかと思いました。Aで非ブロックでputして、Bで非ブロックでgetする流れが考えられます。

回答内容としては以上となりますが、PythonのQueueのサンプルコードではtask_done()やjoin()などが使われていて、これらはC#のキューには無い機能だったので勉強になりました。今回のQueueの用途はデータの受け渡しなので、どちらも使わなくて良いのではないかというように思います。

0Like

Comments

  1. @ken1234566767

    Questioner

    ありがとうございます。
    put, getについて調べてみます。

Your answer might help someone💌