1

メイン スクリプトが強制終了されたときに、Python でスレッドを停止しようとしています。しかし、スレッドは毎時開始されるため、スレッドをすぐに停止するにはどうすればよいですか?

def interval():
    ###the actual work being done here###
    try:
        threading.Timer(3600, interval).start()
    except (KeyboardInterrupt, SystemExit):
        print "Exiting"
        cleanup_stop_interval();
        sys.exit()
interval()
4

3 に答える 3

2

sched.schedulerここの代わりに使用することを検討してthreading.Timerください。注意すべきいくつかの違いがあります。

  • sched.schedulerスレッドではなく、メイン プロセスですべてを実行します。
  • 現在のプロセスに数秒以上かかる場合delay、スケジュールされたイベントは、現在の呼び出しが 完了した後に開始されます。動作が異なります。 で実行される作業に 1 時間以上かかる場合、複数のスレッドが 同時に実行されます。intervalthreading.Timerintervalinterval

interval複数を同時に実行したくないと思うので、sched.schedulerここではthreading.Timer.


import timeit
import sched
import time
import logging
import sys

logger = logging.getLogger(__name__)
logging.basicConfig(level = logging.DEBUG,
                    format = '%(threadName)s: %(asctime)s: %(message)s',
                    datefmt = '%H:%M:%S')
schedule = sched.scheduler(timeit.default_timer, time.sleep)
delay = 5 # change to 3600 to schedule event in 1 hour

def interval():
    logger.info('All work and no play makes Jack a dull boy.')
    schedule.enter(delay = delay, priority = 1, action = interval, argument = ())
    # Uncomment this to see how scheduled events are delayed if interval takes a
    # long time. 
    # time.sleep(10) 

schedule.enter(delay = 0, priority = 1, action = interval, argument = ())
try:
    schedule.run()
except (KeyboardInterrupt, SystemExit):
    print('Exiting')
    sys.exit()
于 2012-12-25T13:36:08.863 に答える
2

そのようにスレッドを強制終了するのは悪い考えです。

  • リソースの保持
  • 他のスレッドの親になる

これを処理する適切な方法は、各スレッドが定期的にチェックして終了する時間かどうかを確認する exit_request フラグを設定し、次を使用して終了するのを待つことです。join()

于 2012-12-25T12:24:07.890 に答える
0

別のスレッドからスレッドを停止することはできません。おそらく必要なのは、スレッドをデーモンスレッドにすることです。つまり、スレッドがまだアクティブであってもプロセスが終了します。

http://docs.python.org/2/library/threading.html#threading.Thread.daemon

デーモン

このスレッドがデーモン スレッドであるか (True)、そうでないか (False) を示すブール値。これは、start() が呼び出される前に設定する必要があります。そうしないと、RuntimeError が発生します。その初期値は作成スレッドから継承されます。メイン スレッドはデーモン スレッドではないため、メイン スレッドで作成されたすべてのスレッドはデフォルトで daemon = False になります。

生きている非デーモン スレッドがなくなると、Python プログラム全体が終了します。

このスレッドが作業を行っている途中でプロセスが終了するという問題が引き続き発生する可能性があることに注意してください。それを防ぎたい場合は、スレッドを頻繁に起動して、正常に終了するかどうかを確認します。

于 2012-12-25T12:18:20.603 に答える