第一种 进程启动后,会默认产生一个主线程。当使用多线程时,主线程产生了子线程。在python中默认setDaemon(False),这种情况就是主线程执行完后自己退出,子线程不会退出
第一种
进程启动后,会默认产生一个主线程。当使用多线程时,主线程产生了子线程。在python中默认setDaemon(False),这种情况就是主线程执行完后自己退出,子线程不会退出而是继续执行,当子线程也执行完之后才会退出。
import time
class MyThread(Thread):
def __init__(self, func_name, args):
super(MyThread, self).__init__()
self.func_name = func_name
self.args = args
def run(self):
self.func_name(*self.args)
def print_1(n):
for i in range(n):
print("print_1:%s" % i)
time.sleep(1)
def print_2(n):
for i in range(n):
print("print_2:%s" % i)
time.sleep(1)
if __name__ == '__main__':
start_time = time.time()
t1 = MyThread(print_1, args=(5,))
t1.start()
t2 = MyThread(print_2, args=(5,))
t2.start()
end_time = time.time()
print("done.................")
print(end_time - start_time)print_1:0
print_2:0done.................
0.0009682178497314453
print_2:1print_1:1
print_1:2print_2:2
print_2:3
print_1:3
print_2:4
print_1:4
Process finished with exit code 0
第二种
当使用setDaemon(True)方法,设置子线程为守护线程时,主线程一旦执行结束,就会导致所有线程全部被终止执行。
import time
class MyThread(Thread):
def __init__(self, func_name, args):
super(MyThread, self).__init__()
self.func_name = func_name
self.args = args
def run(self):
self.func_name(*self.args)
def print_1(n):
for i in range(n):
print("print_1:%s\n" % i)
time.sleep(1)
def print_2(n):
for i in range(n):
print("print_2:%s\n" % i)
time.sleep(1)
if __name__ == '__main__':
start_time = time.time()
t1 = MyThread(print_1, args=(5,))
t2 = MyThread(print_2, args=(5,))
t1.setDaemon(True)
t2.setDaemon(True)
t1.start()
t2.start()
end_time = time.time()
print("done.................")
print(end_time - start_time)print_1:0
print_2:0
done.................
0.0010318756103515625
Process finished with exit code 0
第三种
如果使用join,主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程才会终止。
from threading import Threadimport time
class MyThread(Thread):
def __init__(self, func_name, args):
super(MyThread, self).__init__()
self.func_name = func_name
self.args = args
def run(self):
self.func_name(*self.args)
def print_1(n):
for i in range(n):
print("print_1:%s\n" % i)
time.sleep(1)
def print_2(n):
for i in range(n):
print("print_2:%s\n" % i)
time.sleep(1)
if __name__ == '__main__':
start_time = time.time()
t1 = MyThread(print_1, args=(5,))
t2 = MyThread(print_2, args=(5,))
t1.setDaemon(True)
t1.start()
t2.setDaemon(True)
t2.start()
t1.join()
t2.join()
end_time = time.time()
print("done.................")
print(end_time - start_time)print_1:0
print_2:0
print_2:1
print_1:1
print_1:2
print_2:2
print_2:3
print_1:3
print_2:4
print_1:4
done.................
5.044650077819824
Process finished with exit code 0
如果没用多线程的话,先后执行这两个参数用时10s左右