守护进程:

b 进程守护 a进程,当a进程执行完毕时,b进程会跟着立马结束

守护进程用途:

如果父进程结束了,子进程无需运行了,就可以将子进程设置为父进程的守护进程

例如我们qq视频聊天时,当我们退出qq时,视频界面会跟着退出,视频就是qq的守护进程

守护进程语法:

p.daemon = True

#1.未设置守护进程
from multiprocessing import Process
import time
def task():
print("子进程run")
time.sleep(2)
print("子进程over")
if __name__ == '__main__':
print("主进程run")
p = Process(target = task)
p.start()
print("主进程over")
#执行结果
# 主进程run
# 主进程over
# 子进程run
# 子进程over
#2.设置守护进程
from multiprocessing import Process
import time
def task():
print("子进程run")
time.sleep(2)
print("子进程over")
if __name__ == '__main__':
print("主进程run")
p = Process(target = task)
p.daemon = True
p.start()
time.sleep(0.5)#让子进程起来
print("主进程over")
#执行结果:
#主进程run
# 子进程run
# 主进程over #3.坑
from multiprocessing import Process
import time
def foo():
print(123)
time.sleep(1)
print("end123") def bar():
print(456)
time.sleep(3)
print("end456") if __name__ == '__main__': p1=Process(target=foo)
p2=Process(target=bar) p1.daemon=True
p1.start()
p2.start()
print("main-------")
#打印完print main主进程就算结束了,作为守护进程的p1就挂了不会执行,而p2会执行完毕,主程序终止
#主程序的执行完毕和终止是两个概念,执行完毕是主进程的代码执行完,主进程终止 py文件停止运行
#执行结果
#main-------
#3456
#end456

强调:

设置守护进程需在子进程对象启动之前,即顺序如下:

p.daemon = True

p.start()

否则报错

Traceback (most recent call last):

File "D:/作业/12.28/test.py", line 13, in

p.daemon = True

File "D:\python3\lib\multiprocessing\process.py", line 201, in daemon

assert self._popen is None, 'process has already started'

AssertionError: process has already started

互斥锁:

多个进程共享一份数据时,可能会造成数据错乱

此时我们需要加锁处理

from multiprocessing import Process
import time
import random
def task1():
print("name1:wxx")
time.sleep(random.random())
print("age1:20")
time.sleep(random.random())
print("sex1:sm")
def task2():
print("name2:egon")
time.sleep(random.random())
print("age2:19")
time.sleep(random.random())
print("sex2:fm")
def task3():
print("name3:zb")
time.sleep(random.random())
print("age3:18")
time.sleep(random.random())
print("sex3:m")
if __name__ == '__main__':
p1 = Process(target=task1)
p2 = Process(target=task2)
p3 = Process(target=task3)
p1.start()
p2.start()
p3.start()
#执行结果
name1:wxx
# name2:egon
# name3:zb
# age2:19
# sex2:fm
# age3:18
# age1:20
# sex3:m
# sex1:sm #如上模拟三个打印任务共享一台打印机,打印出的结果是乱的,不是我们想要的结果,此时cpu的利用率是高的 #解决办法:
#1.join改并发为串行,保证了数据不会乱,但执行顺序人为规定,丧失了公平性
from multiprocessing import Process
import time
import random
def task1():
print("name1:wxx")
time.sleep(random.random())
print("age1:20")
time.sleep(random.random())
print("sex1:sm")
def task2():
print("name2:egon")
time.sleep(random.random())
print("age2:19")
time.sleep(random.random())
print("sex2:fm")
def task3():
print("name3:zb")
time.sleep(random.random())
print("age3:18")
time.sleep(random.random())
print("sex3:m")
if __name__ == '__main__':
p1 = Process(target=task1)
p2 = Process(target=task2)
p3 = Process(target=task3)
p1.start()
p1.join()
p2.start()
p2.join()
p3.start()
#执行结果
#name1:wxx
# age1:20
# sex1:sm
# name2:egon
# age2:19
# sex2:fm
# name3:zb
# age3:18
# sex3:m #2加入互斥锁:
from multiprocessing import Process,Lock
import time
import random
def task1(lock):
lock.acquire()
print("name1:wxx")
time.sleep(random.random())
print("age1:20")
time.sleep(random.random())
print("sex1:sm")
lock.release()
def task2(lock):
lock.acquire()
print("name2:egon")
time.sleep(random.random())
print("age2:19")
time.sleep(random.random())
print("sex2:fm")
lock.release()
def task3(lock):
lock.acquire()
print("name3:zb")
time.sleep(random.random())
print("age3:18")
time.sleep(random.random())
print("sex3:m")
lock.release()
if __name__ == '__main__':
lock = Lock()
p1 = Process(target=task1,args = (lock,))
p2 = Process(target=task2,args = (lock,))
p3 = Process(target=task3,args = (lock,))
p1.start()
p2.start()
p3.start()
#保证了数据不乱,而且随机执行,公平

互斥锁:当多个进程共享一份数据,对数据进行修改时,可能会导致数据错乱,加入互斥锁后,进程间抢锁,抢到锁的进程执行自己的代码,期间由于锁被抢走了,没有锁给剩下的进程抢,剩下的进程处于阻塞状态,当抢到锁的进程执行完自己的所有代码,释放出锁,剩下的进程又开始抢,直到最后一个进程抢到锁执行完毕自己的代码

用途:当多个进程共享一份数据并要操作数据时,保证了数据的安全性,不会错乱

强调:1.window系统,子进程的内存空间和父进程的内存空间完全独立,互不影响,此时多个子进程应该抢同一个锁,所以我们在if name == “main”中,新建一个锁,然后把锁传给各个子进程,保证了子进程抢的是同一把锁

2.抢到锁后,执行完代码,一定要记得释放锁

3.使用lock时,只可require一次,不可连续require

RLock可重入锁

首先是互斥锁

锁几次要开几次

死锁:

死锁的前提是有多把锁

程序遇到锁请求就会卡主,等释放

正常开发时,一把锁足够使用,不要开多把锁

IPC inter process communication 进程间通信

1.共享数据

2.在内存里

3.帮我们自动加锁

1.通过文件

可以传输大文件,IO时间长,从硬盘读数据慢

2.管道:基于内存,速度快,单向通讯,使用麻烦

3.队列,申请共享内存空间

传输数据不能太大,速度快,

不只用于进程间通讯,也是一种常见的数据容器

特点是:先进先出

对比堆栈刚好相反:后进先出

队列语法

Queue
q = Queue(1)
q.put()放入任何类型都可以
当放满时会阻塞,
q.put(data,block = True, timeout = None)
三个参数,数据,是否阻塞,超时时间
当放满时,设置不阻塞时,会报错
q.get()
q.get(block = True,timeout = None)
是否阻塞,超时时间
当取完时,设置不阻塞时,会报错 生产者消费者模型:
1.生产者不停生产
2.消费者不停消费
3.生产者消费者之间以队列进行数据沟通 生产者消费者模型
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 为什么要使用生产者和消费者模式
在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。 什么是生产者消费者模式
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

守护进程,互斥锁,IPC,生产者与消费者模型的更多相关文章

  1. 守护进程,互斥锁,IPC,队列,生产者与消费者模型

    小知识点:在子进程中不能使用input输入! 一.守护进程 守护进程表示一个进程b 守护另一个进程a 当被守护的进程结束后,那么守护进程b也跟着结束了 应用场景:之所以开子进程,是为了帮助主进程完成某 ...

  2. python并发编程之守护进程、互斥锁以及生产者和消费者模型

    一.守护进程 主进程创建守护进程 守护进程其实就是'子进程' 一.守护进程内无法在开启子进程,否则会报错二.进程之间代码是相互独立的,主进程代码运行完毕,守护进程也会随机结束 守护进程简单实例: fr ...

  3. 进程(守护进程--互斥锁--IPC机制--生产者模型--僵尸进程与孤儿进程--模拟抢票--消息队列)

    目录 一:进程理论知识 1.理论知识 二:什么是进程? 三:僵尸进程与孤儿进程 1.僵尸进程 四:守护进程 1.什么是守护进程? 2.主进程创建守护进程 3.守护进程 五:互斥锁(模拟多人抢票) 1. ...

  4. 守护模式,互斥锁,IPC通讯,生产者消费者模型

    '''1,什么是生产者消费者模型 生产者:比喻的是程序中负责产生数据的任务 消费者:比喻的是程序中负责处理数据的任务 生产者->共享的介质(队列)<-消费者 2,为何用 实现了生产者与消费 ...

  5. 4 并发编程-(进程)-守护进程&互斥锁

    一.守护进程 主进程创建子进程,然后将该进程设置成守护自己的进程,守护进程就好比崇祯皇帝身边的老太监,崇祯皇帝已死老太监就跟着殉葬了. 关于守护进程需要强调两点: 其一:守护进程会在主进程代码执行结束 ...

  6. 8.9 day30 并发编程 进程理论 进程方法 守护进程 互斥锁

    多道技术 1.空间上的复用 多个程序共用一套计算机硬件 多道技术原理 2.时间上的复用 ​ 切换+保存状态 ​ 1.当一个程序遇到IO操作 操作系统会剥夺该程序的CPU执行权限( 提高了CPU的利用率 ...

  7. python并发编程-进程理论-进程方法-守护进程-互斥锁-01

    操作系统发展史(主要的几个阶段) 初始系统 1946年第一台计算机诞生,采用手工操作的方式(用穿孔卡片操作) 同一个房间同一时刻只能运行一个程序,效率极低(操作一两个小时,CPU一两秒可能就运算完了) ...

  8. 子进程回收资源两种方式,僵尸进程与孤儿进程,守护进程,进程间数据隔离,进程互斥锁,队列,IPC机制,线程,守护线程,线程池,回调函数add_done_callback,TCP服务端实现并发

    子进程回收资源两种方式 - 1) join让主进程等待子进程结束,并回收子进程资源,主进程再结束并回收资源. - 2) 主进程 “正常结束” ,子进程与主进程一并被回收资源. from multipr ...

  9. posix 匿名信号量与互斥锁 示例生产者--消费者问题

    一.posix 信号量 信号量的概念参见这里.前面也讲过system v 信号量,现在来说说posix 信号量. system v 信号量只能用于进程间同步,而posix 信号量除了可以进程间同步,还 ...

  10. POSIX信号量与互斥锁实现生产者消费者模型

    posix信号量 Link with -lpthread. sem_t *sem_open(const char *name, int oflag);//打开POSIX信号量 sem_t *sem_o ...

随机推荐

  1. 使用Hexo 搭建自己的博客

    使用Hexo 搭建自己的博客 最近一直都想着如何去搭建属于自己的博客,有空的时候就写写文章什么的. 本人对该博客系统的要求是: 博文的编写要采用现在流行的MarkDown来进行编写. 本人还不想去注册 ...

  2. c#学习系列之静态类,静态构造函数,静态成员,静态方法(总之各种静态)

    <1>静态类: 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.静态类最大的特点就是共享.在声明一个类时使用static关键字,具有 ...

  3. 2019/05/11 JAVA虚拟机原理

    所谓虚拟机,就是一台虚拟的机器.他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为 系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box.Vmare就属于系统虚拟机,他们完全是对物理计 ...

  4. mint 有线网络未管理的解决

    sudo gedit /etc/NetworkManager/NetworkManager.conf 修改managed=true 参考链接:http://forum.ubuntu.org.cn/vi ...

  5. TLS、SSL、HTTPS以及证书

    转自:http://www.cnblogs.com/kyrios/p/tls-and-certificates.html 最近在研究基于ssl的传输加密,涉及到了key和证书相关的话题,走了不少弯路, ...

  6. RunTests.sh && RunIPhoneSecurityd.sh

    https://github.com/gh-unit/gh-unit/blob/master/Scripts/RunTests.sh     #!/bin/sh   # If we aren't ru ...

  7. 使用python批量导入txt导入excel表格(公司电脑设备ip和人员统计)

    #!/bin/env python # -*- encoding: utf- -*- import datetime import time import os import sys import x ...

  8. SQLite - WHERE子句

    SQLite - WHERE子句 SQLite WHERE子句用于指定一个条件同时抓取数据从一个表或多个表. 如果给定的条件满意,意味着true,然后从表中返回特定值.你会使用WHERE子句来筛选记录 ...

  9. Android(java)学习笔记143:Android中View动画之 XML实现 和 代码实现

    1.Animation 动画类型 Android的animation由四种类型组成: XML中: alph 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动 ...

  10. libxml2.dylb 导致<libxml/tree.h> 老是找不到头文件

    添加了libxml2.dylb的framework ,结果还是引用不了<libxml/tree.h>,  老是提示找不到头文件. 这个问题其实比较容易解决,但是XCode的版本问题确实让开 ...