ある種のID /スレッドオブジェクトの参照を使用してスレッドが実行されているかどうかを調べる方法はありますか。スレッドが実際に特定の時刻に実行されているかどうかを知ることができます。Pythonスレッド:アプリケーションを再起動してもスレッドを追跡できますか?
私は、スレッドモードのアプリケーションで製造プロセスを開始する機能を持っています。サーバーの再起動がなく、何も間違っていない場合は、すべてがバックグラウンドで正常に完了します。
しかし、たとえばサーバが再起動され、スレッドが実行されていたときには、それらはうまくいっても終了しますが、スレッドの完了後にのみ変更されるため、
私はこれらの製造指図をチェックする予定のスケジューラを考えていましたが、製造指図を実行するための関連スレッドが見つからなければ、それは死んでいるとみなされ、再起動する必要があります。
どうすれば適切に追跡できますか?
私はこのコードを持っている:job
が作成された場合、何かがうまくいかないとき
from threading import Thread
def action_produce_threaded(self):
thread = Thread(target=self.action_produce_thread)
thread.start()
return {'type': 'ir.actions.act_window_close'}
def action_produce_thread(self):
"""Threaded method to start job in background."""
# Create a new database cursor.
new_cr = sql_db.db_connect(self._cr.dbname).cursor()
context = self._context
job = None
with api.Environment.manage():
# Create a new environment on newly created cursor.
# Here we don't have a valid self.env, so we can safely
# assign env to self.
new_env = api.Environment(new_cr, self._uid, context)
Jobs = self.with_env(new_env).env['mrp.job']
try:
# Create a new job and commit it.
# This commit is required to know that process is started.
job = Jobs.create({
'production_id': context.get('active_id'),
'state': 'running',
'begin_date': fields.Datetime.now(),
})
new_cr.commit()
# Now call base method `do_produce` in the new cursor.
self.with_env(new_env).do_produce()
# When job will be done, update state and end_date.
job.write({
'state': 'done',
'end_date': fields.Datetime.now(),
})
except Exception as e:
# If we are here, then we have an exception. This exception will
# be written to job our job record and committed changes.
# If job doesn't exist, then rollback all changes.
if job:
job.write({
'state': 'exception',
'exception': e
})
new_cr.commit()
new_cr.rollback()
finally:
# Here commit all transactions and close cursor.
new_cr.commit()
new_cr.close()
は、だから今の部分で、それが立ち往生することができます。それはもうデータベースで更新されないので、「実行中」の状態で立ち往生します。
スレッドの寿命を追跡するシングルトンクラスを使用する必要があります。そのため、定期的に実行されるcronジョブをチェックして、実際に実行されているスレッドと予期せず殺されたスレッドを判断できます。
P.S.おそらくそれを行うためのいくつかの良い習慣があります、もしそうなら、アドバイスをしてください。
私はあなたのスクリプトが完全に消去された場合( 'kill -9'と言う)、スレッドの状態を知る唯一の方法は、それらのスレッド彼らの進歩を書いている...どこか(ファイル、データベース...) – BorrajaX