在python多线程编程中,acquire和release的确切功能是什么

2024-09-30 16:41:07 发布

您现在位置:Python中文网/ 问答频道 /正文

您好,我是Pyhton中的多线程编程新手 就我而言,我认为python中的多线程编程a lock对象可以锁定进程 例如,在self.lock.acquire()下面的代码中,将对象的锁定模式设置为锁定,并且每个面向self.lock.acquire的线程都将停止,直到锁定对象被锁定 然后解锁,然后执行self.lock.acquire下的代码 为了使锁定对象非常精确,在遇到锁定对象时,其默认状态为解锁

self.lock.acquire然后将其设置为lock,其他线程则将面对(self.lock.acquire) 因为它被设置为lock,所以在使用self.lock.realese解锁锁定对象之前,它将等待并且不执行任何操作,因此self.lock.acquire将再次将锁定对象设置为lock模式,然后继续,直到它到达realese对象 但是这里的问题是一个数据是否在两个以上的线程之间共享 到底发生了什么 例如,g下面的代码在三个线程之间共享 我唯一能想象的是它不是真正的多线程,因为当realese函数 add_one被调用,我们知道self.lock.acquire语句在函数或线程中都被阻塞 对于函数add_two和add_two,那么这里会发生什么呢?它会首先执行函数add_two的self.lock.acquire,然后因为我们现在所做的,函数add_two会被锁定,或者什么?? 请准确地告诉我这里会发生什么

from threading import Lock, Thread

lock = Lock()
 g = 0


def add_one():
"""
Just used for demonstration. It’s bad to use the ‘global’
statement in general.
"""

global g
lock.acquire()
g += 1
lock.release()


def add_two():
    global g
    lock.acquire()
    g += 2
    lock.release()

 def add_three():
   global g
   lock.acquire()
   g += 2
   lock.release()


threads = []
for func in [add_one, add_two,add_three]:
threads.append(Thread(target=func))
threads[-1].start()

for thread in threads:
       thread.join()
print(g) 

Tags: 对象函数代码selfaddlockfordef