2017-03-19 13 views
0

私はPython IDEをビルドしています。これは、カーソルの下にある名前のすべての出現箇所を強調表示する必要があります(Jediライブラリを使用)。発生を発見するプロセスは非常に遅くなる可能性があります。Pythonでキャンセル可能なタスクを作成するには?

GUIがフリーズするのを避けるために、別のスレッドで検索を実行することもできますが、ユーザーが数単語をすばやく移動すると、古くなったタスクで作業中にバックグラウンドスレッドが盛り上がる可能性があります。ユーザーが新しい名前に移動したときの前回の検索をキャンセルしたいと思います。

スレッドを殺すように見えますが、Pythonでは複雑です。 Python 3.4以降で簡単にキャンセルできるバックグラウンドタスクを作成するための他のオプションは何ですか?

答えて

1

で見たいと思うかもしれません。これはPythonのものではなくOSの制限です。あなたが行うことができるのは、変数を定期的に検査し、設定されていれば、スレッド自体を停止します(ただ返します)。

さらに、PythonのスレッドにはGILがあります。これは、別のスレッドで実行されるCPU集約型操作が、プロセスごとに1つのスレッドしか同時に実行できないため、メインループに影響を与えます。

検索を別のプロセスで実行することをお勧めします。必要に応じていつでも簡単にキャンセルできます。

YouCompleteMeの人は、例えば、彼らがバックグラウンドで照会することができるHTTP serverにJediをラップしています。完了する前にユーザーがカーソルを移動すると、IDEは単に要求を破棄できます。

3

私はconcurrent.futuresと答えています。
スレッド/プロセスプールを作成するには、submit呼び出し可能で、Futureを受け取ります。必要に応じてcancelを受け取ることができます。

参考:https://docs.python.org/3/library/concurrent.futures.html

+1

いいです。使いやすさ、柔軟性、そして使いやすさという点で、作業キューをどのように使用するのと比較しますか? –

+0

'Future.cancel'はまだ開始されていないタスクに対してのみ動作することに注意してください。進行中のタスクは、完了するまでバックグラウンドで実行し続けます。 – noxdafox

+0

私はそれがほとんどオーバーヘッドを持っていないと非常に使いやすいと言います。提出、結果検索、キャンセルはすべて1ライナーです。作業待ち行列は素晴らしいですが、この状況では過度の過労、IMHOです。 – leovp

1

まあ、私の個人的なお気に入りは、作業キューです。ワンタイムアプリケーションの場合は、python rqをご覧ください。非常に簡単で楽しい使い方。よりプロフェッショナルなものを作りたい場合は、celeryのようなものを見てください。

また、スレッドが別のもので停止することはできませんmultiprocessing

関連する問題