今日内容:

  1、开启子进程的两种方式

  2、join方法

  3、进程之间内存空间相互隔离

  4、僵尸进程和孤儿进程

  5、守护进程

  6、互斥锁

  7、进程对象其他相关的属性和方法

1、开启子进程的两种方式

方式一:

from multiprocessing import Process
import time # 开启子进程的方式一:借助于Process来开启子进程
def task(name):
print(name,'子进程正在运行')
time.sleep(3)
print(name,'子进程death') if __name__ == '__main__':
p = Process(target=task,args=('yxf',))
p.start()
print('主进程')

方式二:

from multiprocessing import Process
import time
# 开启子进程的方式二:自己新建一个类通过继承Process这个类
class Myprocess(Process):
def __init__(self,name):
super().__init__()
self.name = name def run(self):
print(self.name,'正在运行')
time.sleep(3)
print(self.name,'death') if __name__ == '__main__':
p = Myprocess('yxf')
p.start()
print('主进程')

2、join方法

join方法的作用是:使得子进程结束之后再往下进行主进程

from multiprocessing import Process
import time
def tast(name):
print(name,'子进程正在运行')
time.sleep(3)
print(name,'子进程death') if __name__ == '__main__':
p = Process(target=tast,args=('大张哥',))
p.start()
p.join()
print('主进程')

  

3、进程之间内存空间相互隔离

进程之间内存是达到了一种物理隔离的状态,所以进程之间的内存空间不能直接互相共享,并且如果可以共享也会导致数据混乱。

from multiprocessing import Process

n=100
def tast():
global n
n=0
print(n) if __name__ == '__main__':
p = Process(target= tast)
p.start()
p.join()
print(n)
print('主进程')

4、僵尸进程和孤儿进程

僵尸进程对于计算机系统是有害的,因为僵尸进程没有人去管理,若不去清理会导致pid号被占用内存空间也会被占用,达到一定数量就会导致计算机开启不了程序了,所以我们需要手动回收掉这些进程

孤儿进程对于计算机系统是无害的,是因为再liunx系统下会有一个init去管理回收这些孤儿进程。

5、守护进程

守护进程是类似于绑定到主进程的,若主进程运行完毕,守护进程也会直接被关闭。若守护进程先运行完毕,那就守护进程相当于一个正常的子进程。

from multiprocessing import Process
import time def tast(name):
print(name,'老太监还活着')
time.sleep(3)
print(name,'老太监正常死亡') if __name__ == '__main__':
p = Process(target=tast,args=('张'))
p.daemon = True
p.start()
time.sleep(2)
print('主进程')

6、互斥锁

我们之前说子进程是无法在内存中共享自己的内存数据的,但是子进程可以共享计算机硬盘上的数据,因为在硬盘上数据并没有隔离,但是如果一份数据同时被多个子进程操作,那么就会导致数据的混乱,所以这时候就需要用到互斥锁,互斥锁的作用就是,将原本并发的子进程在互斥锁作用到的这段代码中变成串行方式去运行。

#我模拟的是一个抢票系统,我设定了json数据中只剩下了一张票,并产生了10个子进程去抢票
from multiprocessing import Process,Lock
import json
import time,random
def serch(name):
print('客户%s,进入购票系统'%name)
with open(r'E:\code\GoodDog\day34\a.json','rt',encoding='utf-8') as f:
odd = json.load(f)
time.sleep(1)
print('客户%s,剩余票数:%s'%(name,odd['odd']))
def get(name):
with open(r'E:\code\GoodDog\day34\a.json','rt',encoding='utf-8') as f:
odd = json.load(f)
if odd['odd']>0:
time.sleep(random.randint(1,3))
odd['odd']-=1
with open(r'E:\code\GoodDog\day34\a.json', 'wt', encoding='utf-8') as f:
json.dump(odd,f)
print('客户%s,购票成功'%name)
else:
print('客户%s,购票失败'%name)
def tast(name,mutex):
serch(name)
mutex.acquire()
get(name)
mutex.release() if __name__ == '__main__':
mutex = Lock()
for i in range(10):
p = Process(target=tast,args=(i,mutex))
p.start()

7、进程对象其他相关的属性和方法

from multiprocessing import Process,current_process
import time def tast(name):
print('%s%s子进程存活'%(name,current_process().pid))#current_process().pid:用来查看该进程的pid号
time.sleep(3)
print('%s%s子进程death'%(name,current_process().pid)) if __name__ == '__main__':
p = Process(target=tast,args=('a',))
p.start()
p.terminate()#用来停止正在进行的这个子进程
time.sleep(4)
print(p.is_alive())#用来查看子进程是否还在运行
p.join()
print('主',current_process().pid)

调用OS模块查看PID号的方式:

from multiprocessing import Process
import os
import time def tast(name):
print('%s%s子进程存活'%(name,os.getppid()))#os.getppid():用来查看该子进程的主进程PID号
time.sleep(3)
print('%s%s子进程death'%(name,os.getpid()))#,os.getpid():用来查看子进程的PID号 if __name__ == '__main__':
p = Process(target=tast,args=('a',))
p.start()
# p.terminate()
time.sleep(4)
# print(p.is_alive())
p.join()
print('主',os.getppid())

  

day34的更多相关文章

  1. Spark Streaming揭秘 Day34 解析UI监听模式

    Spark Streaming揭秘 Day34 解析UI监听模式 今天分享下SparkStreaming中的UI部分,和所有的UI系统一样,SparkStreaming中的UI系统使用的是监听器模式. ...

  2. BroadcastReceiver和Intetnt的理解 Day34

    BroadcastReceiver和Intetnt的理解 Day34 mobile4.0 短信监控 问题堆栈 1. 下载开源项目View.网址自己fork一下 2. ContentProvider原理 ...

  3. day34——僵尸进程和孤儿进程、互斥锁、进程之间的通信

    day34 僵尸进程和孤儿进程 基于unix环境(linux,macOS) 主进程需要等待子进程结束之后,主进程才结束 主进程时刻监测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收 ...

  4. day34 并行并发、进程开启、僵尸及孤儿进程

    day34 并行并发.进程开启.僵尸及孤儿进程 1.并行与并发 什么是并行? 并行指的是多个进程同时被执行,是真正意义上的同时 什么是并发? 并发指的是多个程序看上去被同时执行,这是因为cpu在多个程 ...

  5. day34 前端基础之JavaScript

    day34 前端基础之JavaScript ECMAScript 6 尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,当然,也不是唯一被标准化的部分.实际上 ...

  6. 兼容,原来在这里就已经開始--------Day34

    看了两天,算是将w3cschool的javascript部分浏览了一遍.在脑海中大约有了一点概念,也才真切体会到:一入江湖深似海.欲穷此路难上难啊,至少如今看起来是遥遥无期.太多不懂, 太多茫然,只是 ...

  7. day34 基于TCP和UDP的套接字方法 粘包问题 丢包问题

    TCP 基于流的协议 又叫可靠性传输协议 通过三次握手 四次挥手 来保证数据传输完毕 缺点效率低 正因为是基于流的协议 所以会出现粘包问题粘包问题:原因一:是应为数据是先发送给操作系统,在操作系统中有 ...

  8. day34 GIL锁 线程队列 线程池

    一.Gil锁(Global Interpreter Lock) python全局解释器锁,有了这个锁的存在,python解释器在同一时间内只能让一个进程中的一个线程去执行,这样python的多线程就无 ...

  9. day34进程相关

    进程1 什么是进程    进程指的是一个正在进行/运行的程序,进程是用来描述程序执行过程的虚拟概念    进程vs程序    程序:一堆代码    进程:程序的执行的过程    进程的概念起源于操作系 ...

随机推荐

  1. Code Signal_练习题_growingPlant

    Each day a plant is growing by upSpeed meters. Each night that plant's height decreases by downSpeed ...

  2. js-ES6学习笔记-Proxy

    1.Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程. 2.Proxy 可以理解成,在目标对象之前架设 ...

  3. javascript:this指向

    this常见指向问题 this的用法 1.直接在函数中使用 谁调用这个函数this就指向谁 2.对象中使用, 一般情况下指向该对象 3.在构造函数中使用 改变this的指向,两种方法的作用都是相同的, ...

  4. es6 类 和构造函数

  5. C# 如何防止重放攻击

    重放攻击 重放攻击是指黑客通过抓包的方式,得到客户端的请求数据及请求连接,重复的向服务器发送请求的行为. 比如你有一个 “购买” 的操作,当你点击购买按钮时,向服务器发送购买的请求.而这时黑客对你的请 ...

  6. FineBI表单如何更新

    FineBI表单如何更新 1. 描述Cube单表更新,是指在某个业务包上面设置定时更新,在某个固定的时间点对某个的业务包中的特定表进行数据更新,部分更新分为两种,全量更新和增量更新,因而在更新策略上则 ...

  7. Linux 配置iso系统盘为本地yum源

    Linux配置iso系统盘为本地yum源 by:授客 QQ:1033553122   1.目的 安装软件时,经常会遇到包或类库的依赖性问题,为此,我们可以通过yum命令安装软件,尽量避免出现繁琐的软件 ...

  8. IE浏览器“自定义安全级别”不能设置的原因

    “自定义安全级别”和滑块都是灰色,不允许设置.可能的原因: 1.组策略里面设置了: 2.启用了IE增强的安全设置: 程序卸载->选择windows组件->取消增强的安全设置

  9. View的layout机制

    View框架的工作流程为:测量每个View大小(measure)-->把每个View放置到相应的位置(layout)-->绘制每个View(draw). 源代码分析 在View的源代码中, ...

  10. Express4.X中的bin/www是作什么用的?为什么没有后缀?

    使用Express4.X的同学会发现,相比Express3.X初始化项目时多了一个bin目录,并且下面还有一个www文件,那么它们有什么用呢? 在Express 3.x中集成了很多中间件,www和ap ...