添加线程
1 | import threading |
join功能
使用join()主线程一直等待全部的子线程结束之后,主线程自身才结束( print('all done\n')),程序退出1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24import threading
import time
def T1_job():
print('T1 start\n')
for i in range(10):
time.sleep(0.1)
print('T1 finish\n')
def T2_job():
print('T2 start\n')
print('T2 finish\n')
def main():
T1_thread = threading.Thread(target=T1_job, name='T1')
T2_thread = threading.Thread(target=T2_job, name='T2')
T1_thread.start()
T2_thread.start()
T1_thread.join()
T2_thread.join()
print('all done\n')
if __name__ == '__main__':
main()
线程锁
不使用线程锁1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23import threading
def job1():
global A
for i in range(10):
A+=1
print('job1',A)
def job2():
global A
for i in range(10):
A+=10
print('job2',A)
if __name__== '__main__':
lock=threading.Lock()
A=0
t1=threading.Thread(target=job1)
t2=threading.Thread(target=job2)
t1.start()
t2.start()
t1.join()
t2.join()
打印结果,很杂乱1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19job1 job21
11job1
job212
22job1
job2 3323
job2job1 4344
job2job1 5554
job2job1 6566
job2job1 7677
job2job1 8788
job2job1 9899
job2job1 110109
使用线程锁
lock在不同线程使用同一共享内存时,能够确保线程之间互不影响1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27import threading
def job1():
global A,lock
lock.acquire() # 在每个线程执行运算修改共享内存之前,执行lock.acquire()将共享内存上锁, 确保当前线程执行时,内存不会被其他线程访问
for i in range(10):
A+=1
print('job1',A)
lock.release() # 执行运算完毕后,使用lock.release()将锁打开, 保证其他的线程可以使用该共享内存
def job2():
global A,lock
lock.acquire()
for i in range(10):
A+=10
print('job2',A)
lock.release()
if __name__== '__main__':
lock=threading.Lock()
A=0
t1=threading.Thread(target=job1)
t2=threading.Thread(target=job2)
t1.start()
t2.start()
t1.join()
t2.join()
打印结果1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20job1 1
job1 2
job1 3
job1 4
job1 5
job1 6
job1 7
job1 8
job1 9
job1 10
job2 20
job2 30
job2 40
job2 50
job2 60
job2 70
job2 80
job2 90
job2 100
job2 110
储存进程结果 Queue
1 | import threading |