目录

进程间的信号

信号量(信号灯)

进程的同步互斥

Event事件

Lock 锁


进程间的信号

信号是唯一的异步通信方法

一个进程向另一个进程发送一个信号来传递某种信息,接受者根据传递的信息来做相应的事

$ kill -l查看系统信号说明

$ kill -9 pid号对进程发送信号

信号名称 说明    
1) SIGHUP 连接断开    
2) SIGINT ctrl+c    
3) SIGQUIT ctrl+\    
20) SIGTSTP ctrl+z    
9) SIGKILL 终止进程    
19) SIGSTOP 暂停进程    
26) SIGVTALRM 时钟信号    
17) SIGCHLD 子进程退出时给父进程发的信号    
       

在Python中import signal可以获取信号

os.kill(pid, sig)

功能:发送信号

参数

pid:要发送信号的PID号

sig :信号名称

import os
import signal
os.kill(12345,signal.SIGKILL) #杀死进程

signal.alarm(time)

个人理解:把发送信号的信息告知系统内核,应用层程序继续运行,时间到之后利用内核告知应用层程序进行处理

功能:非阻塞函数,向自身进程发送一个时钟信号

参数:time->整型时间秒

  import signalimport timesignal.alarm(3)#3秒后向自身发送一个时钟信号while True:time.sleep(1)print("等待时钟信号")'''打印结果等待时钟信号等待时钟信号闹钟'''        
  signal.alarm(3)#3秒后向自身发送一个时钟信号time.sleep(2)signal.alarm(5)#进程只有一个时钟信号,第二个会覆盖上面的时钟信号while True:time.sleep(1)print("等待时钟信号")'''打印结果等待时钟信号等待时钟信号等待时钟信号等待时钟信号闹钟'''

signal.pause()

功能:阻塞进程,然后等待信号

signal.signal(signum, handler)

功能:处理信号

参数

signum:要处理的信号

handler:信号的处理方法

SIG_DFL表示使用默认方法处理

SIG_IGN表示忽略这个信号

function表示传入一个函数,用指定的函数处理

def function(sig, frame)

sig:捕获到的信号

frame:信号对象

import signalfrom time import sleepsignal.alarm(5)  # 5秒后向自身发送一个时钟信号# 使用信号的默认方法处理# signal.signal(signal.SIGALRM,signal.SIG_DFL)    # 忽略时钟信号# signal.signal(signal.SIGALRM,signal.SIG_IGN)# 忽略Ctrl+c信号# signal.signal(signal.SIGINT,signal.SIG_IGN)while True:sleep(2)print("等待时钟...")
  # 使用自定义函数处理信号import signalfrom time import sleepdef fun1(sig, frame):if sig == signal.SIGALRM :print("接收到时钟信号")elif sig == signal.SIGINT :print("ctrl+c就不结束")signal.alarm(5)  # 5秒后向自身发送一个时钟信号# 使用自定义函数处理信号# 处理时钟信号signal.signal(signal.SIGALRM,fun1)    # 处理ctrl+c信号signal.signal(signal.SIGINT,fun1)while True:print("等待")sleep(2)'''打印结果等待等待等待接收到时钟信号等待...'''   

信号量(信号灯)

原理:给定一个数量对多个进程可见,且多个进程都可以操作,进程可以对数量多少的判断执行各自的行为

from multiprocessing import Semaphoresem = Semaphore(num)

功能:创建信号量

参数:信号量的初始值

返回值:信号量的对象

sem.get_value():获取信号量的值

sem.acquire():将信号量 -1,当信号为0时会阻塞

sem.release():将信号量 +1

from multiprocessing import Semaphore, Process
# 创建信号量对象
sem = Semaphore(num)
def fun():print("进程%d等待信号量"%os.getpid())# 消耗一个信号量sem.acquire()print("进程%d消耗信号量"%os.getpid())# 添加一个信号量sem.release()print("进程%d添加信号量"%os.getpid())jobs = []
for i in range(4):p = Process(target = 4)jobs.append(p)p.start()
for i in jobs:i.join()
print(sem.get_value())

进程的同步互斥

临界资源:多个进程或者线程都能操作的共享资源

临界区:操作临界区资源的代码段

同步:同步是一种合作关系,为完成某个任务,多进程或者多线程之间形成的一种协调关系

互斥:互斥是一种制约关系,

Event事件

from multiprocessing import Event

e = Event():创建一个事件对象

e.wait([timeout]):设置事件阻塞

e.set():事件设置,当事件被设置后e.wait()不再阻塞,等于释放资源区

e.clear():清除设置,当事件被设置e.clear()后,e.wait()又会阻塞,阻塞资源区

e.is_set():事件状态判断,判断事件是否处于被设置的状态

from multiprocessing import Event
# 创建事件对象
e = Event()
# 查看
print(e.is_set())        # False
e.set()
print(e.is_set())        # True
e.wait(3)
print(e.is_set())        # True
e.clear()
print(e.is_set())        # False
from multiprocessing import Event,Process
from time import sleepdef wait_event1():print("1想操作临界区资源")e.wait()print("1开始操作临界区资源",e.is_set())with open("file") as f:print(f.read())
def wait_event2():print("2也想操作临界区资源")# 超时3秒检测e.wait(3)# 判断是否被设置if e.is_set():print("2开始操作临界区资源",e.is_set())with open("file") as f:print(f.read())else:print("2不能操作")       # 创建事件对象
e = Event()
p1 = Process(target = wait_event1)
p2 = Process(target = wait_event2)
p1.start()
p2.start()
print("主进程操作")
with open("file",'w') as f:f.write("HELLO WORD")# 延迟4秒释放临界区
sleep(4)
# 释放临界区资源
e.set()
print("释放临界区")
p1.join()
p2.join()

Lock 锁

from multiprocessing import Lock

lock = Lock():创建一个锁对象

lock.acquire():上锁,如果已经是上锁状态,调用此函数会阻塞

lock.release():解锁

from multiprocessing import Lock,Process
import sys
def writer1():# 上锁lock.acquire()for i in range(20):sys.stdout.write("writer1111\n")# 解锁lock.release()
def writer2():# 上锁lock.acquire()for i in range(20):sys.stdout.write("writer2222\n")# 解锁lock.release()
lock = Lock()w1 = Process(target = writer1)
w2 = Process(target = writer2)w1.start()
w2.start()
w1.join()
w2.join()

第二种方法

使用with语句上锁,with语句执行完毕后会自动解

with lock:..........

python 同步 互斥 信号量 锁 简介相关推荐

  1. java 多线程(四)—— 线程同步/互斥=队列+锁

    同步.异步.互斥的区别 在很多文章中,直接把同步缩小为互斥,并称之为同步.下面也是这样的. 一.线程同步 = 队列 + 锁 同步(这里说的其实是互斥)就是多个线程同时访问一个资源. 那么如何实现? 队 ...

  2. python同步锁和互斥锁的区别_浅谈Python线程的同步互斥与死锁

    这篇文章主要介绍了浅谈Python线程的同步互斥与死锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 线程间通信方法 1. 通信 ...

  3. Python | threading04 - 使用信号量,实现线程间同步

    文章目录 一.前言 二.生产者-消费者模型 2.1.代码 2.2.运行的结果 2.3.Semaphore没有设置上限值 一.前言 先说一下信号量与互斥量之间的关系.信号量的一个特殊的应用是互斥锁(互斥 ...

  4. c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...

    为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...

  5. linux 信号量锁 内核,Linux内核信号量互斥锁应用

    主要介绍了Linux 内核关于信号量,互斥锁等的应用 内核同步机制-信号量/互斥锁/读-写信号量 sema ,mutex ,rwsem 信号量 通用信号量 用户类进程之间使用信号量(semaphore ...

  6. Python 进程互斥锁 Lock - Python零基础入门教程

    目录 一.Python 线程互斥锁和进程互斥锁 1.创建线程互斥锁 2.创建进程互斥锁 二.进程互斥锁 Lock 函数介绍 三.进程互斥锁 Lock 使用 案例一:使用进程,但不使用互斥锁 案例二:进 ...

  7. Python 线程互斥锁 Lock - Python零基础入门教程

    目录 一.前言 二.Python 线程共享全局变量 三.Python 线程互斥锁 1.创建互斥锁 2.锁定资源/解锁资源 四.Python 线程死锁 五.重点总结 六.猜你喜欢 一.前言 在前一篇文章 ...

  8. python线程死锁的原因,浅谈Python线程的同步互斥与死锁

    线程间通信方法 1. 通信方法 线程间使用全局变量进行通信 2. 共享资源争夺 共享资源:多个进程或者线程都可以操作的资源称为共享资源.对共享资源的操作代码段称为临界区. 影响 : 对共享资源的无序操 ...

  9. python之互斥锁

    python之互斥锁 1.互斥锁的概念 互斥锁: 对共享数据进行锁定,保证同一时刻只能有一个线程去操作.  [对共享数据进行锁定可以理解为全局变量] 注意: 互斥锁是多个线程一起去抢,抢到锁的线程先执 ...

最新文章

  1. [轉]資料庫讀寫分離
  2. dom定义了访问html文档对象的,HTML DOM (文档对象模型)
  3. Delphi中预想不到的代码楼主zswang(伴水清清)(专家门诊清洁工)2002-05-16 14:20:38 在 Delphi / VCL组件开发及应用 提问
  4. 【IDEA】自动导入无歧义的包
  5. 使用 Palette 让你的 UI 色彩与内容更贴合
  6. nfs:server 172.168.1.22 not responding,still trying问题解决方法 平台为RealARM 210平台
  7. java中的动态绑定与静态绑定
  8. 产品经理和程序员的黑话
  9. 以色列网络安全初创企业Cronus获350万美元A轮融资
  10. yum mysql 如何启动_CentOS7用yum安装MySQL与启动
  11. Vue教程:简介(一)
  12. MongoDB的ObjectId生成原理
  13. eclipse python java_如何使用Eclipse使用Python导入Java类?
  14. 在Windows搭建私人蚂蚁云笔记服务器
  15. Tkinter 常用控件复选框
  16. 国标MPEG-PS实时流播放器开发(附例子)
  17. 零基础学Python需要用到哪些软件?
  18. Android 彻底杀死当前进程
  19. Java 中continue基础用法
  20. c语言打字游戏程序设计报告,打字游戏程序设计报告.doc

热门文章

  1. 算法时间复杂度lg是多少_时间复杂度入门理解
  2. 单片机sleep函数的头文件_单片机学习day8—单片机IO扩展
  3. SmartNIC/DPU — 技术方向
  4. altium designer寻找未连接飞线
  5. matlab-高数 find 找到集合中特定元素的位置
  6. 学习笔记第三十一节课
  7. 《中国人工智能学会通讯》——12.38 知识库与 HTML 表格的融合
  8. 《电路分析导论(原书第12版)》一2.5.1 电池
  9. testng xml 示例
  10. jquery选择器玩得不6啊,只能慢慢写判断了,唉..........................