3

エグゼキューター (スレッドまたはプロセス) をすぐに終了できるようにしながら、一定の間隔で特定の関数の実行を継続的に繰り返すための最良の方法は何ですか?

基本的に私は2つのアプローチを知っています:

  1. time.sleep無限サイクルで最後にマルチプロセッシングと関数を使用します。process.terminate()どの状態でも処理は終了します。
  2. スレッドを使用し、スレッド関数の最後で常にタイマーを再作成します。timer.cancel()while sleepによって処理が終了します。

(「どんな状態でも」と「眠っている間」はどちらも問題ありませんが、後者は即時ではないかもしれません). 問題は、後者がARMで動作しないように見えるため、マルチプロセッシングとスレッドの両方を使用する必要があることです(pythonインタープリターとvimのあいまいな相互作用、vimの外ではすべて問題ありません)(私はそこで2番目のアプローチを使用していましたが、試していませんthreading+cycle; コードは現在残っていません) そして、前者は非常に多くのプロセスを生成しますが、本当に必要でない限り、私は見たくありません。これは、2 つの異なるアプローチをコーディングしなければならないという問題につながりますが、cycle は/でラップされたthreadingすべてのものをドロップイン置換するためのインポートをさらに数回行うだけです(ただし、 はありません )。仕事をするためのより良い方法はありますか?multiprocessingifelsethread.terminate()

現在使用されているコードはここにあります(現在、両方のジョブのサイクルがあります)が、質問に答えるのにあまり役に立たないと思います。

更新:私がこのソリューションを使用している理由は、vimステータスラインのバージョン管理システムでファイルステータス(およびブランチなどの他のもの)を表示する機能です。これらのステータスは更新する必要がありますが、フックを使用しないとすぐに更新することはできません。フックを一時的に設定し、ユーザー設定を損なわずに vim 終了時に削除する方法がわかりません。したがって、標準的な解決策は、N 秒後にキャッシュが期限切れになることです。しかし、キャッシュの有効期限が切れると、高価なシェル呼び出しを行う必要があり、遅延が目立つように見え、IO 負荷が重くなるほど顕著になります。私が今実装しているのは、別のプロセスで N 秒ごとに表示されたバッファの値を更新しているため、遅延は私ではなくそのプロセスを悩ませています。GIL は外部プログラムの呼び出しに影響を与えないため、スレッドも機能する可能性があります。

4

2 に答える 2

1

タスクを無限にループする単一の長寿命スレッドが機能しない理由がよくわかりません。または、マルチプロセス オプションで多くのプロセスが発生するのはなぜですか?

私の即時の反応は、やるべきことをフィードするためのキューを備えた単一のスレッドだったでしょう。しかし、私は問題を誤解しているかもしれません。

于 2012-10-30T21:33:56.130 に答える
0

Python で簡単かつ/またはきれいに行う方法はわかりませんが、* nix システムの crontab など、既存のシステム スケジューラを利用できないのではないかと考えていました。

PythonにはAPIがあり、ニーズを満たすかもしれません。

于 2012-10-30T20:49:37.030 に答える