2017-01-19 13 views
1

私は、taskqに追加された各タスクが実行中で、何かを計算している、例えば30秒というかなり単純なプログラムを持っています。このタスクはwhileやforのループで実行されていません。Python - 長時間実行されているtaskqのスレッドを停止する

def run(self): 
    while not self.stopper.is_set(): 
     DO_MY_30_SECONDS_WORK(self) 
     self.task_done() 

ここで、私はthread.eventを持っていると仮定し、これはタスクが完了する前/後にチェックすることができます。しかし、すでに実行中のスレッドに実行を停止または終了するよう指示する方法があります。

+0

私はあなたの昨年のような問題を抱えていて、問題を処理するためにSIGNALを使用しました。メインスレッドで別のスレッドを開始し、ヘルパースレッドでタイムカウンタを開始することができます。カウンタが終了すると、メインスレッドにシグナルが与えられ、シグナルを受け取ることによってシグナルが消滅します。あなたは[this](https://pymotw.com/2/signal/)を見たいかもしれません。 – cengineer

+0

はあなたの仕事のいくつかのpythonコードですか、それとも 'subprocess'を使って実行する別のプログラムですか? – hansaplast

+0

これはちょうどpythonコードですが、おそらくCurl呼び出しを使用しています。 – Jay

答えて

1

DO_MY_30_SECONDS_WORK(self)がブロックしている場合は、実行中のスレッドを停止する方法はありません。間違いなくあなたはdaemonスレッドとして設定することができ、メインプログラムの実行が終了すると突然終了します。スレッドが実際にリソースを保持している場合(たとえばファイルへの書き込みなど)、一般的には終了しないと問題が発生しますスレッド。

あなたができることは、DO_MY_30_SECONDS_WORK(self)を再設計して、それをノンブロッキングにすることです。これは、作品を小さな断片に切断し、妥当な間隔で停止標識をチェックすることを意味します。あなたがそうするように言うと、自分自身を完成させます。

+0

ありがとう...うん、それは私がやっていることだ。私はちょうどそれを小さなものにカットしています。 – Jay

関連する問題