python threading 线程相关笔记

import threading

假设主线程: t, 子线程: t1


import threading 
import time 

class MyThread(threading.Thread): 
        def __init__(self,id): 
                threading.Thread.__init__(self)
                self.id = id 

        def run(self): 
                for i in range(5):
                        time.sleep(1)
                        print("in t: %d" %self.id )

if __name__ == "__main__": 
        t1=MyThread(555) 
        t1.start() 
        for i in range(5): 
                time.sleep(1)
                print(i) 

执行结果:
0
in t: 555
1
in t: 555
2
in t: 555
3
in t: 555
4
in t: 555

多次执行后,可发现 主线程 跟 子线程 的执行顺序是不固定的。如果要控制 主线程 跟 子线程 的执行顺序,可以考虑在 t1.start()之后用 join()。


if __name__ == "__main__": 
        t1=MyThread(555) 
        t1.start() 
        t1.join()
        for i in range(5): 
                time.sleep(1)
                print(i)

1.t1.join([timeout])的作用:主线程 t 会在调用的地方等待,直到子线程 t1 完成操作后,才可以接着往下执行。
可选参数 timeout 代表线程运行的最大时间,即如果超过这个时间,主线程会从 t1.join()后面接着执行。经过测试,当 timeout 到达时,如果子线程 t1 还没有执行完成,这时就会出现 t 和 t1 同时执行的情况。如果在主线程的 t1.start() 之前没有设置 t1.setDaemon(True),还会出现主线程已执行结束,但子线程还在执行,或者有可能无限挂起。(这一点跟网上很多人说的 timeout 到达后,子线程无论是否执行完毕都会被回收的说法不一致。相关文章
验证代码:


import threading 
import time 

class MyThread(threading.Thread): 
        def __init__(self,id): 
                threading.Thread.__init__(self)
                self.id = id 

        def run(self): 
                for i in range(15):
                        time.sleep(1)
                        print("in t: %d" %self.id )

if __name__ == "__main__": 
        t1=MyThread(555) 
        #t1.setDaemon(True)
        t1.start() 
        t1.join(5)
        for i in range(5): 
                time.sleep(1)
                print(i)

2.t1.setDaemon()的作用:把主线程 t 设置为守护线程,要是主线程 t 执行结束了,就不管子线程 t1 是否完成,一并和主线程 t 退出。
必须在 t1.start() 方法调用之前设置,如果不设置为守护线程,程序有可能会被无限挂起。


if __name__ == "__main__": 
    t1=MyThread(555) 
    t1.setDaemon(True)
    t1.start() 
    for i in range(5): 
            time.sleep(1)
            print(i)

Leave a Reply

Your email address will not be published.