join()使用方法:
使用join对控制多个线程的执行顺序非常关键。
(更多控制的是,线程和非线程之间的执行顺序,对于多个线程的控制顺序一般用lock)
def thread_job():
print(‘T1 start\n’)
for i in range(10):
time.sleep(0.1)
print(‘T1 finish\n’)
add_thread=threading.Thread(target=thread_job,name=‘T1’)
add_thread.start()
add_thread.join() #用来控制,当T1这个任务执行完之后,才能进行其他的任务。
print(‘all done\n’)
lock使用方法:
lock在不同线程使用同一共享内存时,能够确保线程之间互不影响,使用lock的方法是, 在每个线程执行运算修改共享内存之前,执行lock.acquire()将共享内存上锁, 确保当前线程执行时,内存不会被其他线程访问,执行运算完毕后,使用lock.release()将锁打开, 保证其他的线程可以使用该共享内存。
join和lock的区别:
join()表示要堵塞主线程直到这个线程完成,并不影响子线程的同时进行,只是代表在join()后边的语句必须等待join的这个线程完成才能执行:join()并不能阻止各个线程互相干涉。
lock()则表示要阻止线程同时访问相同的共享数据来防止线程相互干扰,所以线程只能一个一个执行,不能同时进行。使用lock()使得线程只能一个一个进行。
import threading
def job1():
global A, lock
lock.acquire() #开始锁住一个进程
for i in range(10):
A += 1
print(‘job1’, A)
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()
#如果不加入lock,输出的可能是
job1
job2 11
job2 21
job2 31
job2 41
job2 51
job2 61
job2 71
job2 81
job2 91
job2 101
job1 102
job1 103
job1 104
job1 105
job1 106
job1 107
job1 108
job1 109
job1 110
加上lock之后,会在执行完join1之后,才会执行join2
job1 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
莫烦多线程教程:https://mofanpy.com/tutorials/python-basic/threading/lock/