使用Python 3.5中的事件结束循环线程

时间:2017-03-23 19:40:10

标签: python multithreading events python-multithreading

我在停止循环线程时遇到问题。我使用一个事件来停止循环,但输出与我预期的不同。我写了以下代码

import threading 
from time import sleep

class foo(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.stop_event = threading.Event()

    def run(self):
        while not self.stop_event.is_set():
            print('1')
            sleep(1)
            print('2')
            sleep(1)
        print('done')

class bar(threading.Thread):
    def __init__(self):
       threading.Thread.__init__(self)
       self.run_thread()


    def run_thread(self):
       th1 = foo()
       th1.start()
       sleep(4)
       th1.stop_event.set()

prgm = bar()
prgm.run_thread()

给我输出:

1
2
1
2
1
done
2
1
2
done

我期待“完成”这个词。当while循环结束时打印onces。但出于某种原因,已经完成了#39;打印两次。我使用的事件是错误的还是线程多次启动?

2 个答案:

答案 0 :(得分:1)

您已在self.run_thread()(即bar)的构造函数中执行bar.__init__

class bar(...):
    def __init__(self):
       threading.Thread.__init__(self)

       # !!!!
       self.run_thread()

因此,当您创建bar的实例时:

stuff = bar()

正在执行bar.run_thread 。您当前的代码执行此函数两次

prgm = bar() # executed here
prgm.run_thread() # and here

因此,您会遇到一些意外行为。

答案 1 :(得分:0)

缺少两点:

  1. if __name__ == '__main__':
  2. 之前添加prgm = bar()
  3. 在每个sleep(0.1)A
  4. 之前添加run...