python多线程中join()的理解

在 Python 的多线程编程中,常常碰到 thread.join()这样的代码。那么今天我们用实际代码来解释一下 join 函数的做用。python

第一,当一个进程启动以后,会默认产生一个主线程,由于线程是程序执行流的最小单元,当设置多线程时,主线程会建立多个子线程,在python中,默认状况下(其实就是setDaemon(False)),主线程执行完本身的任务之后,就退出了,此时子线程会继续执行本身的任务,直到本身的任务结束,例子见下面。编程

# coding: utf-8
# 测试多线程中join的功能
import threading, time
def doWaiting():
    print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"
    time.sleep(3)
    print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"
def doWaiting1():
    print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"
    time.sleep(8)
    print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n"
tsk = []
thread1 = threading.Thread(target = doWaiting)
thread1.start()
tsk.append(thread1)
thread2 = threading.Thread(target = doWaiting1)
thread2.start()
tsk.append(thread2)
print 'start join: ' + time.strftime('%H:%M:%S') + "\n"

print 'end join: ' + time.strftime('%H:%M:%S') + "\n"

代码执行结果以下:多线程

start waiting1: 22:24:20

start join: 22:24:20
start waiting2: 22:24:20


end join: 22:24:20

stop waiting1: 22:24:23

stop waiting2:  22:24:28

第二,当咱们使用setDaemon(True)方法,设置子线程为守护线程时,主线程一旦执行结束,则所有线程所有被终止执行,可能出现的状况就是,子线程的任务尚未彻底执行结束,就被迫中止,例子见下面。app

 1 # coding: utf-8
 2 # 测试多线程中join的功能
 3 import threading, time
 4 def doWaiting():
 5     print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"
 6     time.sleep(3)
 7     print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"
 8 def doWaiting1():
 9     print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"
10     time.sleep(8)
11     print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n"
12 tsk = []
13 thread1 = threading.Thread(target = doWaiting)
14 thread1.setDaemon(True)
15 thread1.start()
16 tsk.append(thread1)
17 thread2 = threading.Thread(target = doWaiting1)
18 thread2.setDaemon(True)
19 thread2.start()
20 tsk.append(thread2)
21 print 'start join: ' + time.strftime('%H:%M:%S') + "\n"
22 
23 print 'end join: ' + time.strftime('%H:%M:%S') + "\n"

代码执行结果以下:函数

start waiting1: 22:34:46

start waiting2: 22:34:46
start join: 22:34:46


end join: 22:34:46

第三,没有设置守护线程且没有设置join函数的timeout参数时,主线程将会一直等待,直到子线程所有结束,主线程才结束,程序退出。代码以下:测试

 1 # coding: utf-8
 2 # 测试多线程中join的功能
 3 import threading, time
 4 def doWaiting():
 5     print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"
 6     time.sleep(3)
 7     print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"
 8 def doWaiting1():
 9     print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"
10     time.sleep(8)
11     print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n"
12 tsk = []
13 thread1 = threading.Thread(target = doWaiting)
14 thread1.start()
15 tsk.append(thread1)
16 thread2 = threading.Thread(target = doWaiting1)
17 thread2.start()
18 tsk.append(thread2)
19 print 'start join: ' + time.strftime('%H:%M:%S') + "\n"
20 for tt in tsk:
21     tt.join()
22 print 'end join: ' + time.strftime('%H:%M:%S') + "\n"

代码执行结果以下:spa

start waiting1: 22:41:50

start join: 22:41:50
start waiting2: 22:41:50


stop waiting1: 22:41:53

stop waiting2:  22:41:58

end join: 22:41:58

第四,当没有设置守护线程且join函数的参数timeout=2时,主线程将会等待多个子线程timeout的累加和这样的一段时间,时间一到,主线程结束,可是并无杀死子线程,子线程依然能够继续执行,直到子线程所有结束,程序退出。代码以下:线程

 1 # coding: utf-8
 2 # 测试多线程中join的功能
 3 import threading, time
 4 def doWaiting():
 5     print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"
 6     time.sleep(3)
 7     print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"
 8 def doWaiting1():
 9     print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"
10     time.sleep(8)
11     print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n"
12 tsk = []
13 thread1 = threading.Thread(target = doWaiting)
14 thread1.start()
15 tsk.append(thread1)
16 thread2 = threading.Thread(target = doWaiting1)
17 thread2.start()
18 tsk.append(thread2)
19 print 'start join: ' + time.strftime('%H:%M:%S') + "\n"
20 for tt in tsk:
21     tt.join(2)
22 print 'end join: ' + time.strftime('%H:%M:%S') + "\n"

代码执行结果以下:code

start waiting1: 23:02:34

start waiting2: 23:02:34
start join: 23:02:34


stop waiting1: 23:02:37

end join: 23:02:38

stop waiting2:  23:02:42

第五,当设置守护线程join函数的参数timeout=2时,主线程将会等待多个子线程timeout的累加和这样的一段时间,时间一到,主线程结束,杀死未执行完的子线程,程序退出。代码以下:blog

 1 # coding: utf-8
 2 # 测试多线程中join的功能
 3 import threading, time
 4 def doWaiting():
 5     print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"
 6     time.sleep(3)
 7     print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"
 8 def doWaiting1():
 9     print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"
10     time.sleep(8)
11     print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n"
12 tsk = []
13 thread1 = threading.Thread(target = doWaiting)
14 thread1.setDaemon(True)
15 thread1.start()
16 tsk.append(thread1)
17 thread2 = threading.Thread(target = doWaiting1)
18 thread2.setDaemon(True)
19 thread2.start()
20 tsk.append(thread2)
21 print 'start join: ' + time.strftime('%H:%M:%S') + "\n"
22 for tt in tsk:
23     tt.join(2)
24 print 'end join: ' + time.strftime('%H:%M:%S') + "\n"

代码执行结果以下:

start waiting1: 23:23:57

start waiting2: 23:23:57
start join: 23:23:57


stop waiting1: 23:24:00

end join: 23:24:01
相关文章
相关标签/搜索