Python线程 - 简单但棘手

时间:2016-08-29 22:38:38

标签: python multithreading

有人可以指出,为什么我的代码不打印“你好”。我觉得我的线程2 - t2没有启动。这只是一个代码片段,我正在努力在我的主程序中实现。基本上,我的想法如下:

  1. 有一个功能 - 有两组代码 - 一个代码在“if condition statement”中,另一个代码在“while loop”中
  2. 线程1 - 使用功能1 - “while while”连续 - 直到我突然停止程序
  3. 线程2或线程3或线程4等想要使用相同的功能 - 但“if condition statement”下的代码
  4. 我在下面的代码中的方法是让一个线程1 - 连续运行,而thread2 - 在不中断thread1的情况下完成它的工作。
  5. 代码:

    import threading
    import Queue
    
    
    
    def Continuous(stop_event, queue_read, queue_write,lock):
    
        #lock.acquire()
        try:
    
            if stop_event == True:
    
                print stop_event.is_set()
                print "hello"
                c = 7
                d = 8
                msg2 = (c+d)*2
                queue_write.put(msg2)
    
            while not stop_event.wait(1):
                print "hello2"
                #print ("working on %s" % arg)
                a = 3;
                b = 4
                msg1 = a*b
                queue_read.put(msg1)
                time.sleep(1)
    
        finally:
            print "Inside finally"
            #lock.release()
    
        print"Outside try and finally"
    
    
    
    
    def main():
    
        pill2kill = threading.Event()
        lock = threading.Lock()
    
        pill2kill.clear()
        queue1 = Queue.Queue()
        queue2 = Queue.Queue()
        #self.queue2 = Queue.Queue()
        t1 = threading.Thread(target = Continuous, args = (pill2kill,queue1,queue2,lock))
        t1.deamon = True
        t1.start()
    
        print "asdfasfd"
        time.sleep(2)
        pill2kill_1 = threading.Event()
        pill2kill_1.set()
        print "hjgkhj"
        t2 = threading.Thread(target=Continuous, args=(pill2kill_1, queue1, queue2,lock))
        t2.start()
        t2.join()
        pill2kill.clear()
        print "End of program"
    
    
    main()
    

    PS:我非常抱歉,以这种方式发布我的代码。我尝试了超过15分钟,而且我无法将其格式化

1 个答案:

答案 0 :(得分:0)

(由评论转换,因为OP的后续评论明确表达了他们的期望)问题来自于误用Event

  1. if stop_event == True:将始终评估为False,而if块永远不会执行其内容(stop_eventEvent,它不相等对bool类型的任何内容,您的意思是if stop_event.is_set():?)。这样可以防止hello被打印。
  2. 在创建线程之前设置第二个线程的事件,更不用说启动它,因此while not stop_event.wait(1):将立即退出循环而不执行正文(防止打印hello2);唯一预期的输出来自finally块,低于finally
  3. 旁注:t1.deamon = True什么都不做;该属性拼写为daemon。由于你从来没有set线程1的Event,这似乎意味着程序永远不会退出。