join和lock的区别:

  1. join()表示要堵塞主线程直到这个线程完成,并不影响子线程的同时进行,只是代表在join()后边的语句必须等待join的这个线程完成才能执行:join()并不能阻止各个线程互相干涉。
  2.  lock()则表示要阻止线程同时访问相同的共享数据来防止线程相互干扰,所以线程只能一个一个执行,不能同时进行。使用lock()使得线程只能一个一个进行。

lock使用方法:

lock在不同线程使用同一共享内存时,能够确保线程之间互不影响,使用lock的方法是, 在每个线程执行运算修改共享内存之前,执行​​lock.acquire()​​将共享内存上锁, 确保当前线程执行时,内存不会被其他线程访问,执行运算完毕后,使用​​lock.release()​​将锁打开, 保证其他的线程可以使用该共享内存。

join()使用方法:

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')
join和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