1. .tart()方法
在threading模块中,start()方法其实跑的就是类中的run()函数,因此会见到有些类直接继承threading之后,编辑run()函数即可实现功能。
import threading, time
class MyThread(threading.Thread):
def run(self):
start = time.time()
sum = 0
for i in range(100000000):
sum += i
end = time.time()
print(self, sum, end-start)
t1 = MyThread()
t1.start()
t2 = MyThread()
t2.start()
print('主线程也在跑')
完全与一般写法实现了同样的效果,而且能用反复使用一个函数
运行结果:可以发现,主线程和子线程是竞争关系,谁跑的快谁先结束,不过主线程会等待子线程结束后再退出
2. .join()方法
import threading, time
class MyThread(threading.Thread):
def __init__(self, arg):
threading.Thread.__init__(self)
self.arg = arg
def run(self):
start = time.time()
sum = 0
for i in range(self.arg): #(100000000):
sum += i
end = time.time()
print(self, sum, end-start)
t1 = MyThread(10000000)
t2 = MyThread(100000000)
t1.start()
t2.start()
t1.join()
print('主线程也在跑')
运行结果:可以发现,在主线程遇到某个子线程的join方法之后会在该句话上昌盛阻塞
3. .setDaemon(True)方法守护线程(守护主线程)
- 加入join方法,setDaemon方法就没有作用了
- 如果其它线程需要主线程等待,主线程还是不会结束
- 必须在启动前设置。RuntimeError: cannot set daemon
import threading, time
class MyThread(threading.Thread):
def __init__(self, arg):
threading.Thread.__init__(self)
self.arg = arg
def run(self):
start = time.time()
sum = 0
for i in range(self.arg): #(100000000):
sum += i
end = time.time()
print(self, sum, end-start)
t1 = MyThread(10000000)
t2 = MyThread(100000000)
t1.setDaemon(True)
t1.start()
#t1.join() # 加入join方法,setDaemon方法就没有作用了
#t2.start() # 如果其它线程需要主线程等待,主线程还是不会结束
# t1.setDaemon(True) # 必须在启动前设置。RuntimeError: cannot set daemon status of active thread
print('主线程也在跑')
运行结果:主线程如果先结束就不会等待子线程