一 : 概述

  当多个进程同时访问一个变量或者一个文件的时候,可能会发生数据紊乱的问题,为了解决这个问题,便有了锁这个工具.

二 : 锁的创建和使用

  使用到的锁也是在multiprocessing包中的Lock类,要使用锁将它实例化即可.

  锁可以使得一个变量或文件在同时只能有一个进程访问,相当于给变量(或文件)加了一把锁,当该进程使用完毕,将锁释放之后,其他进程才可以访问.

from multiprocessing import Process,Lock
import timedef check(i):with open('余票') as f:con = f.read()print('第%s个人查到余票还剩%s张'%(i,con))def buy_ticket(i,l):l.acquire()# 拿钥匙,锁门with open('余票') as f:con = int(f.read())time.sleep(0.1)if con > 0:print('\033[31m 第%s个人买到票了\033[0m'%i)con -= 1else:print('\033[32m 第%s个人没有买到票\033[0m'%i)time.sleep(0.1)# 是指 买完票后,把余票数量重写写入数据库的时间延迟with open('余票','w') as f:f.write(str(con))l.release()# 还钥匙,开门if __name__ == '__main__':l = Lock()for i in range(10):p_ch = Process(target=check,args=(i+1,))p_ch.start()for i in range(10):p_buy = Process(target=buy_ticket,args=(i+1,l))p_buy.start()

  对象的acquire()方法可以加锁,release()可以释放锁,将需要加锁的代码块放在这两句中间即可.

三 : 信号量的创建和使用

  有时候,我们需要多个进程同时访问一个方法,但是又要对他们加以控制,换个说法,也就是需要一个有多把钥匙的锁,这时候我们需要信号量(Semaphore)

  使用方法和Lock一致,不同的是实例化的时候需要传入一个int类型的参数,也就是创建几把钥匙,加锁和释放的方法也和lock一致,非常简单.

from multiprocessing import Process,Semaphore
import timedef func(i,sem):sem.acquire()print('第%s个人进入小黑屋,拿了钥匙锁上门' % i)time.sleep(1)print('第%s个人出去小黑屋,还了钥匙打开门' % i)sem.release()if __name__ == '__main__':sem = Semaphore(5)# 初始化了一把锁5把钥匙,也就是说允许5个人同时进入小黑屋# 之后其他人必须等待,等有人从小黑屋出来,还了钥匙,才能允许后边的人进入for i in range(20):p = Process(target=func,args=(i,sem,))p.start()

四 : 事件的创建和使用

  为了使用主进程控制子进程,创建了事件机制.要使用事件,需要导入multiprocessing包中的Event,通过几个方法控制来事件.

  事件处理的机制:全局定义一个flag(event.is_set()),如果为False,那么程序执行event.wait()的时候就会阻塞,为True,则不阻塞.

  事件的方法:

    set() : 将flag设为True

    clear() : 将flag设为False

    is_set() : 返回flag的值

  下面用一个红绿灯函数来演示事件的使用

def tra(e):'''信号灯函数'''while 1:# 红绿灯得一直亮着,要么是红灯要么是绿灯if e.is_set():# True,代表绿灯亮,那么此时代表可以过车time.sleep(5)# 所以在这让灯等5秒钟,这段时间让车过print('\033[31m 红灯亮! \033[0m')# 绿灯亮了5秒后应该提示到红灯亮e.clear()# 把is_set设置为Falseelse:time.sleep(5)# 此时代表红灯亮了,此时应该红灯亮5秒,在此等5秒print('\033[32m 绿灯亮! \033[0m')# 红的亮够5秒后,该绿灯亮了e.set()# 将is_set设置为Truedef Car(i,e):e.wait()# 车等在红绿灯,此时要看是红灯还是绿灯,如果is_set为True就是绿灯,此时可以过车print('第%s辆车过去了'%i)if __name__ == '__main__':e = Event()triff_light = Process(target=tra,args=(e,))# 信号灯的进程
    triff_light.start()for i in range(50):# 描述50辆车的进程if i % 3 == 0:time.sleep(2)car = Process(target=Car,args=(i+1,e,))car.start()

转载于:https://www.cnblogs.com/DoingBe/p/9519203.html

python中的进程(二)相关推荐

  1. python中的进程池:multiprocessing.Pool()

    python中的进程池: 我们可以写出自己希望进程帮助我们完成的任务,然后把任务批量交给进程池 进程池帮助我们创建进程完成任务,不需要我们管理. 进程池:利用multiprocessing 下的Poo ...

  2. Python 中的进程、线程、协程、同步、异步、回调(一)

    在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说明一点术语.当我们说"上下文"的时候,指的是程序在执行中的一个状态.通常我们会用调用栈来表示这个状态--栈记载了每个调 ...

  3. Python中的进程和线程

    一.Python中两种创建进程的方式 1.os.fork只适用于Linux/Mac 2.使用multiprocessing模块可以跨平台实现多进程 使用os.fork(),像Linux平台上那样创建多 ...

  4. 在Python中对子进程进行非阻塞读取

    我正在使用子流程模块来启动子流程并连接到其输出流(stdout). 我希望能够在其stdout上执行非阻塞读取. 有没有一种方法可以使.readline成为非阻塞状态,或者在调用.readline之前 ...

  5. 【循序渐进学Python】Python中的循环(二)——while循环与嵌套

    [循序渐进学Python]Python中的循环--while循环与嵌套 while循环(在给定的判断条件为 True 时执行循环体,False退出循环体) 当满足一定条件的时候才循环,具体循环多少次没 ...

  6. 用于Python中的进程和系统监视的跨平台库psutil

    最近平台运行,出现一些问题,考虑如何设置监控.发现一个Python库,感觉非常实用.分享一下. psutil(Process and system实用程序)是一个跨平台库,用于检索运行过程和系统利用( ...

  7. python中父子进程

    最近在使用python中的multiprocessing模块时遇到一些问题,很多人应该遇到相同问题,简单研究下,供有需要的参考. 首先,要明白multiprocessing的出现很大程度是为了解决py ...

  8. 深入理解Python中的进程

    博客核心内容: 进程的概念 并行与并发的区别 同步与异步的概念 进程创建的方式 父进程和子进程的关系 线程的相关概念 Python中进程池的相关概念 Python的的回调函数 进程池+回调函数的实际应 ...

  9. Python中的进程和线程(20)

    进程和线程 进程 创建多进程 进程和全局变量 传递参数和进程号 进程的状态 进程之间通信 put() get()方法 生产者和消费者 进程子类化 生产者和消费者子类化 进程池 线程 线程子类化 共享全 ...

  10. python中的进程

    阅读目录 进程:顾名思义,运行中的程序 一.创建进程的方式:(2种) 两种方式都是利用multiprocessing模块导入Process类来实现具体方法看代码 第一种: from multiproc ...

最新文章

  1. 你以为border-radius只是圆角吗?【各种角度】
  2. 继承 抽象 接口 多态
  3. Yii的控制器等名称获取
  4. 《挖掘管理价值:企业软件项目管理实战》一2.4 软件设计过程
  5. C#通过工厂模式,我把一大堆if干掉了
  6. 【Python CheckiO 题解】Even the Last
  7. LeetCode 1738. 找出第 K 大的异或坐标值(DP)
  8. 数据库 数据库编程二
  9. windows下安装cygwin以及SeismicUnix在cygwin下的安装(windows下安装linux环境,非虚拟机、非双系统)
  10. 队列在层次遍历中的应用
  11. Xception: Deep Learning with Depthwise Separable Convolutions
  12. MongoDB:配置与安装
  13. jQuery实现留言板案例
  14. 读书笔记《Redis入门指南》
  15. 修复inspinia中popover的点击问题
  16. Jmeter---脚本录制
  17. Java swing的主题风格设置
  18. 北京知产局:鼓励当事人用区块链,获取、固定知识产权纠纷证据
  19. 数码相机和单反相机区别
  20. Pycharm安装第三方库以及出错原因(Mac版)

热门文章

  1. 程序员应该收藏哪些资讯类网站
  2. 苹果Mac 上的 Spotlight 除了基本的搜寻外,还有这些快捷键技巧
  3. InDesign 2022 for mac排版布局和页面设计
  4. 在 Mac 上用输入法如何以另一种语言键入?
  5. Mac电脑用CrossOver安装的Windows软件位置
  6. 当内存512遇上Access数据库600M,IO磁盘受伤了
  7. Python内置的服务器的使用
  8. ubuntu,装完PYTHON3 pip3 install 报错
  9. 利用python抓取网页图片
  10. Loadrunner关联