2017-02-14 8 views
0

1つのmain関数mainFunc(フラスコモジュールを使ってRestfulサービスとして公開されている)からいくつかの関数を呼び出しています。実行には数分から1時間かかることがあり、30秒ごとに進捗状況(関数の出力が呼び出される)が表示されます。 As Rest API呼び出しは別のプログラムからmainFunc()に行われるので、各呼び出し時に出力(つまり現在の状態)を返す必要があります。python関数のstdoutを定期的に返す方法は?

How to capture stdout output from a Python function call?としてyieldとStringIOを試しましたが、それを動作させることができませんでした。stdoutは、すべてのタスクの完了時にのみ返され、その間には返されません。これができるかどうかをお勧めします。

mainFunc(): 
    runs_for_5_mins() 
    runs_for_30_mins() 
    ... 
    return output 

答えて

0

もちろん実行できます。質問はどれくらい複雑であるべきかだけです。

進捗状況を出力する最良の方法は、この出力自体を実行するように長期実行ルーチンを微調整することです。ルーティンは、情報がどのくらい表示されているか、どのくらい前になっているかを示すものなので、他の誰もルーティン自体ほど正確ではありません。ルーチンには、進捗情報を入れる特別なstream(例えばオープンファイルハンドル)を与えることができる。呼び出し元としてあなたは単にsys.stderrまたはそれに類するものを渡すことができます。

しかし、あなたは喜んでたり、ルーチンを変更することはできませんならば、それに直面してみましょう:あなたは、並列に二つのことをしたい:

  1. あなたmainFunc()関数からのルーチンの呼び出しと
  2. 進行出力。

1つのプロセス内で並列処理を行うには、スレッドを使用します。だから、

    はそれぞれ30秒は、いくつかの進歩出力、 は、ルーチン自体を終了するスレッドを知らせる終了後
  1. 、あなたのルーチンを開始
  2. 印刷し、あなたの進行状況のスレッドを始める

この方法で問題を解決したい場合は、ここで詳しく説明します。

+0

Alfeさん、ありがとうございました。並列メソッドのスレッドは私に適しています。マルチプロセッシングを使うべきですか? – redeye

+0

標準モジュールスレッディングを使用します。マルチプロセッシングは複数のプロセス用です。 – Alfe

関連する問題