首页 > 系统相关 >10月30日 进程锁+队列

10月30日 进程锁+队列

时间:2023-10-30 11:24:38浏览次数:37  
标签:10 get 队列 30 timeout 进程 True block

目录

进程锁+队列

进程锁有些类似于绑定方法,它被某个进程使用时,其它进程就要等这个进程结束才能用这个方法。这么做是为了保证数据的安全,加进程锁保证了多个进程修改同一块数据时,同一时间只能有一个进程可以修改,即串行的修改。

然后进程锁要用到模块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

相关文章

  • 嵌入式硬件中常见的100种硬件选型方式
    1请列举您知道的电阻、电容、电感品牌(最好包括国内、国外品牌)。电阻:美国:AVX、VISHAY威世日本:KOA兴亚、Kyocera京瓷、muRata村田、Panasonic松下、ROHM罗姆、susumu、TDK台湾:LIZ丽智、PHYCOM飞元、RALEC旺诠、ROYALOHM厚生、SUPEROHM美隆、TA-I大毅、TMTEC泰铭、TOK......
  • Java 业务开发常见错误 100 例
    第一讲:使用并发工具库类,建议容易犯的四类错:只知道使用并发工具,但并不清楚当前线程的来龙去脉,解决多线程问题却不了解线程;--错误误以为使用了并发工具就可以解决一切线程安全问题,期望通过把线程不安全的类替换为线程安全的类来一键解决问题。--错误没有充分了解并发工具......
  • CPU 100%问题排查
    引用:https://blog.csdn.net/qq_37515544/article/details/123921604https://blog.csdn.net/yujing1314/article/details/114524668 一、定位哪个程序占用的CPU较高linux命令:top    二、jstack使用2.1栈信息输出命令格式:jstackpid>文件信息eg:jstack5115>a.tx......
  • 10.30算法
    无重复字符的最长子串给定一个字符串s,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3。示例2:输入:s="bbbbb"输出:1解释:因为无重复字符的最长子串是"b",所以其长度......
  • 10.23~10.29
    补题补了Mea的Math2反演内容。学习了一下树分块的模板。补了部分Hanghang的dp优化。补了一点基础DS、基础dp。比赛打了一场lxsround和北大附联考,感觉发挥不错(希望NOIP有这个状态),但是都有挂分。lxsround第四题写挂了,100->40。北大附联考第三题写挂了,100->......
  • 【2023-10-18】还要适应
    20:00总有一条路你必须走,总有一条路你必须放弃,选择根本就是放弃的同义词。                                                 ——卡尔维诺换了办公室,最大的影响就是下......
  • 【2023-10-16】新的适应
    20:00有时我们会得到未曾料到的赞美声誉,有时我们会碰到求全苛责的毁谤攻击。面对这些,要保持自己的人格定力,不要太在意别人说你什么,因为知人本来就不是一件易事。                                    ......
  • 【2023-10-17】家的归属
    20:00放开眼睛去看,张开耳朵去听,天下没有一个东西不是你的功课。                                                 ——许倬云从二宝活蹦乱跳的程度以及她的胃口来看,好......
  • 今日总结10.30
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解建造者模式的动机,掌握该模式的结构;2、能够利用建造者模式解决实际问题。 [实验任务一]:计算机组装使用建造者模式,完成下述任务:计算机组装工厂可以将CPU、内存、硬盘、主机等硬件设备组装在一起构成计算机,计算机......
  • 【2023-10-12】二宝肠炎
    20:00我父亲总是说,一个孩子需要四样东西——充分的爱、富于营养的食物、有规律的睡眠、大量的肥皂和水——这些完了呢,他最需要的是一些明智的放任。                                        ......