示例代码如下:
import multiprocessing
def deposit(balance):
for i in range(100):
balance.value += 1
def withdraw(balance):
for i in range(100):
balance.value -= 1
if __name__ == '__main__':
balance = multiprocessing.Value('i', 200)
d = multiprocessing.Process(target=deposit, args=(balance,))
w = multiprocessing.Process(target=withdraw, args=(balance,))
d.start()
w.start()
d.join()
w.join()
print(balance.value)
该示例有竞争条件。如果在取款之前,存款进程已经修改了帐户余额,那么取款进程将没有得到正确的余额。
为了解决这个问题,我们可以使用锁(Lock)来保护共享资源。锁是一种同步原语,只允许一个进程访问共享资源。修改后的代码如下:
import multiprocessing
def deposit(balance, lock):
for i in range(100):
with lock:
balance.value += 1
def withdraw(balance, lock):
for i in range(100):
with lock:
balance.value -= 1
if __name__ == '__main__':
balance = multiprocessing.Value('i', 200)
lock = multiprocessing.Lock()
d = multiprocessing.Process(target=deposit, args=(balance, lock))
w = multiprocessing.Process(target=withdraw, args=(balance, lock))
d.start()
w.start()
d.join()
w.join()
print(balance.value)
在这个版本的代码中,我们传递了一个锁对象lock
给deposit
和withdraw
函数,并使用with lock:
语句在修改balance
值时保护它。这样可以确保在有一个进程正在修改balance
时,另一个进程将会被阻塞,直到锁被释放为止。这样可以避免竞争条件的
上一篇:并发保存多个实体的更改
下一篇:并发编程练习