0

最近、Python 2.7.5〜2.7.6でPythonスレッドをいじっています。奇妙な状況に気づきました(まあ、実際にはそうではないかもしれませんが、私にとっては本当に奇妙です)

これが私が実行していたコードです

まず、次のようにスレッドを拡張するクラスを定義します。

class worker(threading.Thread):
    def __init__(self):
        super(worker, self).__init__(name='a_name')
    def run(self):
        print 'running'
        time.sleep(5)
        print 'exiting'

次に、pythonプログラムのメインスレッドで開始しました

workers = []
_worker = worker()
workers.append(_worker)
_worker.start()
is_running = _worker.is_alive()
while is_running:
    for _worker in workers:
        print 'checking...'
        print _worker.ident, _worker.is_alive()
        if not _worker.is_alive():
            _worker = worker()
            _worker.start()
            print 'restarting...'
            print _worker.ident, _worker.is_alive()
    time.sleep(2)

私が遭遇した状況は、このコードを実行すると、最初のワーカー スレッドが終了する前に、すべてが完全にうまくいくということです。ただし、終了したスレッドを再起動しようとすると、スリープ前の最後のチェックで is_alive が True になるのに、その直後に for ループ内の最初のチェックで False が返されるため、奇妙なことが起こります。

以下は、ターミナルからの出力です。

running...checking...
4319211520 True

checking...
4319211520 True
checking...
4319211520 True
exiting...
checking...
4319211520 False
running...
restarting...
4319211520 True
checking...
4319211520 False
running...
restarting...
4325380096 True

私の主な質問は、スレッドを再起動するたびにチェックが失敗するのはなぜですか?

4

1 に答える 1