Python 多线程实例
一、直接调用
#!/usr/bin/python # -*- coding : utf-8 -*- # 作者: Presley # 时间: 2018-11-19 # 邮箱:1209989516@qq.com # 这是我用来练习python多线程的测试脚本 import threading import time def sayhi(num): #定义每个线程要运行的函数 print("runnin on number:%s" %num) time.sleep(3) if __name__ == "__main__": t1 = threading.Thread(target=sayhi,args=(1,)) t2 = threading.Thread(target=sayhi,args=(2,)) #生成另一个线程实例 t1.start() #启动线程 t2.start() #启动另一个线程 print(t1.getName()) print(t2.getName())
二、继承的方式启动一个线程
#!/usr/bin/python # -*- coding : utf-8 -*- # 作者: Presley # 时间: 2018-11-19 # 邮箱:1209989516@qq.com # 这是我用来练习python多线程的测试脚本 import threading import time class MyThread(threading.Thread): def __init__(self,num): threading.Thread.__init__(self) #经典类的继承方法 self.num = num def run(self): #定义每个线程要运行的函数 #这个类里面必须要写run这个方法并且必须写死了只能叫run, 线程.start即执行这个方法 print("running on number:%s" %self.num) time.sleep(3) if __name__ == "__main__": t1 = MyThread(1) t2 = MyThread(2) t1.start() t2.start() print(t1.getName()) print(t2.getName())
三、join (等待线程执行完后才执行下一步)
#!/usr/bin/python # -*- coding : utf-8 -*- # 作者: Presley # 时间: 2018-11-19 # 邮箱:1209989516@qq.com # 这是我用来练习python多线程的测试脚本 import threading import time class MyThread(threading.Thread): def __init__(self,num): threading.Thread.__init__(self) #经典类的继承方法 self.num = num def run(self): #定义每个线程要运行的函数 #这个类里面必须要写run这个方法并且必须写死了只能叫run, 线程.start即执行这个方法 print("running on number:%s" %self.num) time.sleep(3) if __name__ == "__main__": t1 = MyThread(1) t2 = MyThread(2) t1.start() t2.start() print(t1.getName()) print(t2.getName()) t1.join() #等待t1执行完后执行下一步即t1.wait() t2.join()#等待t2执行完后执行下一步 即t2.wait() print("--main--")
四、并行等待,等最后一个线程执行完后执行下一步
#!/usr/bin/python # -*- coding : utf-8 -*- # 作者: Presley # 时间: 2018-11-19 # 邮箱:1209989516@qq.com # 这是我用来练习python多线程的测试脚本 import threading import time def sayhi(num): #定义每个线程要运行的函数 print("runnin on number:%s" %num) time.sleep(3) if __name__ == "__main__": t_list = [] for i in range(10): t = threading.Thread(target=sayhi,args=[i,]) t.start() t_list.append(t) for i in t_list: i.join() print("--main--")
五、setDaemon
程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法了。
1、
import threading import time class MyThread(threading.Thread): def __init__(self,id): threading.Thread.__init__(self) def run(self): time.sleep(5) print "This is " + self.getName() if __name__ == "__main__": t1=MyThread(999) t1.setDaemon(True) t1.start() print "I am the father thread."
执行结果:
I am the father thread.
2、
#!/usr/bin/python # -*- coding : utf-8 -*- # 作者: Presley # 时间: 2018-11-19 # 邮箱:1209989516@qq.com # 这是我用来练习python多线程的测试脚本 import threading import time def run(n): print("[%s]------running------\n" %n) time.sleep(4) print("done") def main(): for i in range(5): print('aaa') print('bbb') print('ccc') t = threading.Thread(target=run,args=[i,]) #time.sleep(1) t.start() t.join() print("starting thread",t.getName()) print('ddd') m = threading.Thread(target=main,args=[]) m.setDaemon(True) #主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.这就是setDaemon方法的含义,这基本和join是相反的。此外,还有个要特别注意的:必须在start() 方法调用之前设置,如果不设置为守护线程,程序会被无限挂起。 m.start() m.join() #里面的参数时可选的,代表线程运行的最大时间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接着执行的。 print("--main thread done--")
执行结果:
aaa bbb ccc [0]------running------ done starting thread Thread-2 ddd aaa bbb ccc [1]------running------ done starting thread Thread-3 ddd aaa bbb ccc [2]------running------ done starting thread Thread-4 ddd aaa bbb ccc [3]------running------ done starting thread Thread-5 ddd aaa bbb ccc [4]------running------ done starting thread Thread-6 ddd --main thread done--
若main方法中去掉t.join结果为
aaa bbb ccc [0]------running------ starting thread Thread-2 ddd aaa bbb ccc [1]------running------ starting thread Thread-3 ddd aaa bbb ccc [2]------running------ starting thread Thread-4 ddd aaa bbb ccc [3]------running------ starting thread Thread-5 ddd aaa bbb ccc [4]------running------ starting thread Thread-6 ddd --main thread done--