第一种
进程启动后,会默认产生一个主线程。当使用多线程时,主线程产生了子线程。在python中默认setDaemon(False),这种情况就是主线程执行完后自己退出,子线程不会退出而是继续执行,当子线程也执行完之后才会退出。
from threading import Thread
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)方法,设置子线程为守护线程时,主线程一旦执行结束,就会导致所有线程全部被终止执行。
from threading import Thread
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:%sn" % i)
time.sleep(1)
def print_2(n):
for i in range(n):
print("print_2:%sn" % 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 Thread
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:%sn" % i)
time.sleep(1)
def print_2(n):
for i in range(n):
print("print_2:%sn" % 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左右



