Python线程是非常奇怪的结果

时间:2013-09-02 14:36:21

标签: python multithreading

我最近在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

所以我的主要问题是为什么每次重新启动线程时检查都会失败?

1 个答案:

答案 0 :(得分:2)

重新启动工作人员时,需要更新workers。分配给_worker将不会这样做:workers仍将包含旧线程,并且您将一遍又一遍地检查旧线程。