PYTHON——多线程:Join&Daemon

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(): 设置线程名。
原文地址:https://www.cnblogs.com/chenhaiming/p/9908292.html