LOCK

本文介绍了使用Python的multiprocessing库中的Lock对象实现进程间的同步互斥。通过两个进程worker1和worker2对共享资源sys.stdout的操作,展示了如何利用Lock对象避免竞态条件,确保同一时间只有一个进程能够访问临界区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程间同步互斥方法:

from multiprocessing import Lock
lock=Lock()# 创建进程锁对象
lock.acquire() #给临界区上锁
lock.release() #给临界区解锁

具体实现上acquire()为一个条件阻塞函数,当有任意一个进程先进行了操作后,其他进程再企图进行acquire操作时就会阻塞,直到lock对象被release 后其他进程才可进行下次acquire操作


加锁例子:

from multiprocessing import  Lock,Process
import  time,sys

def worker1(stream):
    lock.acquire()
    for i in range(5):
        time.sleep(1)
        stream.write("Lock acquired via\n")
    lock.release() #解锁之后才能放行,继续执行worker2

def worker2(stream):
    lock.acquire()#枷锁,wworker2也需要加锁,才能进行阻塞。
    for i in range(5):
        time.sleep(1)
        stream.write("Lock acquired dirctly\n")
    lock.release()#解锁

lock=Lock()

#sys.stdout 为所有进程都拥有的资源
w1=Process(target=worker1,args=(sys.stdout,))
w2=Process(target=worker2,args=(sys.stdout,))

w1.start()
w2.start()

w1.join()
w2.join()


with lock :#也是实现加锁,解锁

例子:

from multiprocessing import  Lock,Process
import  time,sys

def worker1(stream):

    with lock: #第二种加锁方法
        for i in range(5):
            time.sleep(1)
            stream.write("Lock acquired via\n")


def worker2(stream):

    with lock: #加锁,
        for i in range(5):
            time.sleep(1)
            stream.write("Lock acquired dirctly\n")


lock=Lock()

#sys.stdout 为所有进程都拥有的资源
w1=Process(target=worker1,args=(sys.stdout,))
w2=Process(target=worker2,args=(sys.stdout,))

w1.start()
w2.start()

w1.join()
w2.join()

### Record Lock 的概念与工作原理 #### 什么是 Record Lock? Record Lock 是一种数据库锁机制,用于锁定具体的行数据。它确保在事务隔离级别下,其他事务无法对被锁定的行进行修改或删除操作,从而保证数据的一致性和完整性[^3]。 #### 工作原理 Record Lock 锁定的是索引记录本身,而不是记录之间的间隙。当一个事务对某一行执行更新、删除或带有 `FOR UPDATE` 或 `LOCK IN SHARE MODE` 的查询时,数据库会对该行加 Record Lock[^1]。这种锁可以防止其他事务在同一行上执行冲突的操作。 例如,在 MySQL 的 InnoDB 存储引擎中,如果事务 A 执行以下 SQL 语句: ```sql SELECT * FROM table WHERE id = 5 FOR UPDATE; ``` 此时,数据库会为 `id = 5` 的行加上 Record Lock,阻止其他事务对该行进行修改或删除操作。 #### 使用场景 Record Lock 主要用于以下场景: - **更新操作**:当事务需要更新某一行的数据时,可以通过 Record Lock 防止其他事务同时修改同一行。 - **删除操作**:当事务需要删除某一行的数据时,可以通过 Record Lock 确保其他事务不会在删除过程中修改该行。 - **一致性读取**:在某些隔离级别下(如可重复读),通过 Record Lock 可以避免脏读和不可重复读问题[^3]。 #### 示例代码 以下是一个简单的示例,展示如何在 MySQL 中使用 Record Lock: ```sql -- 假设表 t 中有以下数据:id = {1, 2, 3} START TRANSACTION; -- 对 id = 2 的行加锁 SELECT * FROM t WHERE id = 2 FOR UPDATE; -- 此时,另一个事务尝试更新 id = 2 的行会失败 UPDATE t SET column = 'new_value' WHERE id = 2; ``` 在这个例子中,`SELECT ... FOR UPDATE` 语句对 `id = 2` 的行加了 Record Lock,因此另一个事务无法对该行进行更新操作。 #### Record Lock 与其他锁的关系 - **Next-Key Lock**:Next-Key Lock 是 Record Lock 和 Gap Lock 的组合,用于更精细地控制并发访问[^1]。 - **Gap Lock**:Gap Lock 锁定的是索引记录之间的间隙,而 Record Lock 锁定的是具体的行。 - **意向锁**:意向锁是表级锁,用于表明事务是否有意向对表中的行加锁,但与 Record Lock 不直接冲突[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值