目录
进程锁+队列
进程锁有些类似于绑定方法,它被某个进程使用时,其它进程就要等这个进程结束才能用这个方法。这么做是为了保证数据的安全,加进程锁保证了多个进程修改同一块数据时,同一时间只能有一个进程可以修改,即串行的修改。
然后进程锁要用到模块Lock
然后就是进程锁与join的区别和功能点:
区别点:进程锁是把锁住的代码变成串行,join是把所有子进程变成了串行。
相同点:都是为了保护数据的安全性
给进程进行锁的时候需要用到Lock模块里面的acquire方法,解锁就需要用到Lock模块里面的release方法
以抢票程序为基础进行修改
代码如下
import json
import os
import time
from multiprocessing import Process, Lock
# 这里是查票的功能
def chakan():
time.sleep(1) # 这是模拟网路
with open('db.txt', mode='rt', encoding='utf-8') as du: # 这里打开文件夹然后读取票的数量
res = json.load(du)
print(f'还剩{res["count"]}')
# 这里是取票的功能
def get():
with open('db.txt', mode='rt', encoding='utf-8') as du:
res = json.load(du)
print(f'还剩{res["count"]}')
# 这里添加一个判断
time.sleep(2) # 模拟网络
if res["count"] > 0:
res["count"] -= 1 # 给文件内的票数进行减去
with open('db.txt', mode='wt', encoding='utf-8') as huo:
json.dump(res, huo)
print(f'{os.getpid()}抢票成功')
time.sleep(2) # 模拟网络
else:
print('票已经售空了!!!!')
# 这里打印抢票失败的情况
print(f'{os.getpid()}抢票失败')
def task(lock): # 这里将锁传进来,进行使用
chakan()
#锁住
lock.acquire()#这里是进行锁
get()
#释放锁头
lock.release()#这里进行解锁
if __name__ == '__main__':
lock = Lock()#定义一把锁,保证每个进程用的都是同一个锁
for i in range(5):
p = Process(target=task,args=(lock,))
p.start()
用于存放票的文件还是不变
结果如下
结果说明了进程锁也能保证不会出现多个人买到同一张票,但是进程锁是把用到的进程变成串行,join是把所有进程变成串行
队列
队列(queue)底层就是管道和锁
这个(queue)是multiprocessing里面的一个模块
首先需要生成一个队列
q = Queue(maxsize)#此时这就是队列
maxsize参数是队列中运行最大的项数,省略则无大小限制
将进程放入队列用(put)
格式如下:
put(任意类型的数据, block, timeout)
如果队列满了,这里面的block为True,并且timeout为正值,该方法会让代码等待timeout指定的时间,直到该队列有了新的空间。如果时间到了队列还没有新的空间,就会抛出Queue.Full异常。
如果block为False,同时这个队列还是满的就会立刻抛出Queue.Full异常。
读取并且删除队列里面的数据用(get)
格式如下:
get(block=True/False, timeout=任意数字)
如果block为True并且timeout为正值,那么在等待时间内没有取得任何元素,会抛出Queue.Empty异常。
如果block为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,队列为空,则立即抛出Queue.Empty异常。
简短点就是put里面的block = True,如果队列满了会等待,timeout最多等待n秒,n秒过后队列还是满的就报错
具体代码
from multiprocessing import Queue
q = Queue()
#这里是将下面的数据放入到队列里面
q.put('123', block=True, timeout=2)
q.put('jocker', block=True, timeout=2)
q.put([1, 2, 3, 4, 5, 6], block=False, timeout=2)
#读取并且删除
print(q.get(block=True, timeout=1))
print(q.get(block=True, timeout=3))
print(q.get(block=False, timeout=3))
放入和读取删除这两个方法里面的
block = False就是可以理解为不等
block = True就是等待的意思
结果如图
标签:10,get,队列,30,timeout,进程,True,block From: https://www.cnblogs.com/slzjb/p/17797324.html