多进程抢占资源 当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题。
代码语言:javascript复制 import os
import time
import random
from multiprocessing import Process,Lock
def work(n):
print('%s: %s is runing' % (n,os.getpid()))
time.sleep(random.random())
print('%s: %s is down' % (n, os.getpid()))
if __name__ == '__main__':
for i in range(3): # 利用for循环模拟多进程
p=Process(target=work,args=(i,))
p.start()
输出结果:
0: 10974 is runing
1: 10975 is runing
2: 10976 is runing
1: 10975 is down
2: 10976 is down
0: 10974 is down
加锁
代码语言:javascript复制# 由并发变成了串行,牺牲了运行效率,但避免了竞争
import os
import time
import random
from multiprocessing import Process,Lock
def work(lock,n):
lock.acquire()
print('%s: %s is runing' % (n,os.getpid()))
time.sleep(random.random())
print('%s: %s is down' % (n, os.getpid()))
lock.release()
if __name__ == '__main__':
lock = Lock()
for i in range(3):
p=Process(target=work,args=(lock,i))
p.start()
输出结果:
0: 10986 is runing
0: 10986 is down
1: 10987 is runing
1: 10987 is down
2: 10988 is runing
2: 10988 is down
上面这种情况虽然使用加锁的形式实现了顺序的执行,但是程序又重新变成串行了,这样确实会浪费了时间,却保证了数据的安全。这个过程类似于数据库的事务
例子:模拟抢票
没有加锁的情况,虽然实现了并发,但是数据不安全,本来只有一张票,但是还是会有多个人抢到,这显然不符合现实
代码语言:javascript复制# 文件db的内容为:{"count":1}
# 注意一定要用双引号,不然json无法识别
# 并发运行,效率高,但竞争写同一文件,数据写入错乱
from multiprocessing import Process
import time,json,random
def search():
dic = json.load(open('db'))
print('