1、setDaemon(True):
将线程声明为守护线程,必须在start() 方法调用之前设置, 如果不设置为守护线程程序会被无限挂起。这个方法基本和join是相反的。当我们 在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程 就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如 果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是 只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以 用setDaemon方法啦
2、join():
在子线程完成运行之前,这个子线程的父线程将一直被阻塞。
Join()和Daemon()方法实例:
import threading from time import ctime,sleep # def music(func): # for i in range(2): # print('I was listening to {},{}'.format(func,ctime())) # sleep(3) # print('End Listen. %s' %ctime()) # def move(func): # for i in range(2): # print('I was at the %s! %s' %(func,ctime())) # sleep(5) # print('End Move. %s' % ctime()) # # threads = [] # t1 = threading.Thread(target=music,args=('七里香',)) # threads.append(t1) # t2 = threading.Thread(target=move,args=('阿甘正传',)) # threads.append(t2) # # if __name__ == '__main__': # for t in threads: # t.start() # t1.join() # t2.join() # print('all over %s' %ctime()) ''' 共花了10秒的时间。单线程运行,需要花16秒=(10秒+6秒) ''' def music(func): print(threading.current_thread()) for i in range(2): print('I was listening to {},{}'.format(func,ctime())) sleep(3) print('End Listen. %s' %ctime()) def move(func): print(threading.current_thread()) for i in range(2): print('I was at the %s! %s' %(func,ctime())) sleep(5) print('End Move. %s' % ctime()) threads = [] t1 = threading.Thread(target=music,args=('七里香',)) threads.append(t1) t2 = threading.Thread(target=move,args=('阿甘正传',)) threads.append(t2) if __name__ == '__main__': t1.setDaemon(True) for t in threads: # t.setDaemon(True) #守护线程:主线程结束,不再等子线程,就结束了 t.start() print(threading.current_thread()) print(threading.active_count()) print('all over %s' %ctime())
3、线程其他方法:
thread 模块提供的其他方法: # threading.currentThread(): 返回当前的线程变量。 # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。 # 除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法: # run(): 用以表示线程活动的方法。 # start():启动线程活动。 # join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。 # isAlive(): 返回线程是否活动的。 # getName(): 返回线程名。 # setName(): 设置线程名。