在使用python进行多线程编程时, 为了防止多线程同时修改同一个变量, 使用threading.Lock()对关键操作加锁, 进程有自己独立的内存单元,而线程则共享创建他们的进程的内存单元,多线程在运行时,如果要对同一个资源进行使用,那么就会面临资源共享的问题,处理不当,会对数据造成破坏
进程有自己独立的内存单元,而线程则共享创建他们的进程的内存单元,多线程在运行时,如果要对同一个资源进行使用,那么就会面临资源共享的问题,处理不当,会对数据造成破坏, 在上一篇文章中,你已经见识到了多进程同时修改变量所引发的数据冲突问题。
为了避免这种情况的发生,我们需要在对共享资源进行修改时加锁,同一个时刻,只能有一个线程获得这把锁,然后对数据进行操作,其他的线程只能等待。这样,就可以避免多个线程同时修改一份数据。
你可以使用threading.Lock()对关键操作加锁, 我修改上一篇所使用的代码
import threading
import time
m_lock = threading.Lock()
a = 0
def worker():
time.sleep(1)
global a
for i in range(100000):
m_lock.acquire() # 加锁
a += 1
m_lock.release() # 释放锁
thread_lst = []
for i in range(5):
t = threading.Thread(target=worker)
thread_lst.append(t)
for t in thread_lst:
t.start()
for t in thread_lst:
t.join()
print(a)
仅仅添加了两行代码,进行加锁和释放锁的操作,就可以获得锁期望的结果了,最终a的值是500000
你也可以使用with语句来简化代码,避免忘记释放锁
def worker():
time.sleep(1)
global a
for i in range(100000):
with m_lock:
a += 1
QQ交流群: 211426309