一、定义
我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序,一旦开启也不受我们控制。尽管并发编程让我们能更加充分的利用IO资源,但是也给我们带来了新的问题:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理。
1、 多进程抢占输出资源
多进程
使用锁维护秩序顺序
1 import os
2 import time
3 import random
4 from multiprocessing import Process
5
6 def work(n):
7 print('%s: %s is running' %(n,os.getpid()))
8 time.sleep(random.random())
9 print('%s:%s is done' %(n,os.getpid()))
10
11 if __name__ == '__main__':
12 for i in range(3):
13 p=Process(target=work,args=(i,))
14 p.start()
2、 使用锁维护执行顺序
1 # 由并发变成了串行,牺牲了运行效率,但避免了竞争
2 import os
3 import time
4 import random
5 from multiprocessing import Process,Lock
6
7 def work(lock,n):
8 lock.acquire()
9 print('%s: %s is running' % (n, os.getpid()))
10 time.sleep(random.random())
11 print('%s: %s is done' % (n, os.getpid()))
12 lock.release()
13 if __name__ == '__main__':
14 lock=Lock()
15 for i in range(3):
16 p=Process(target=work,args=(lock,i))
17 p.start()
二、抢票系统
1 #注意:首先在当前文件目录下创建一个名为db的文件
2 #文件db的内容为:{"count":1},只有这一行数据,并且注意,每次运行完了之后,文件中的1变成了0,你需要手动将0改为1,然后在去运行代码。
3 #注意一定要用双引号,不然json无法识别
4 #加锁保证数据安全,不出现混乱
5 from multiprocessing import Process,Lock
6 import time,json,random
7
8 #查看剩余票数
9 def search():
10 dic=json.load(open('db')) #打开文件,直接load文件中的内容,拿到文件中的包含剩余票数的字典
11 print('