今日内容:

  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. js实现获取URL参数

    function GetQueryString(name) { var reg = new RegExp("(^|&)"+ name +"=([^&]*) ...

  2. BZOJ3165: [Heoi2013]Segment(李超线段树)

    题意 题目链接 Sol 李超线段树板子题.具体原理就不讲了. 一开始自己yy着写差点写自闭都快把叉积搬出来了... 后来看了下litble的写法才发现原来可以写的这么清晰简洁Orz #include& ...

  3. js-ES6学习笔记-正则的扩展

    1.在ES5中,RegExp构造函数的参数有两种情况.第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag).第二种情况是,参数是一个正则表示式,这时会返回一个原有正则表达式的拷 ...

  4. Android系统启动流程(四)Launcher启动过程与系统启动流程

    此前的文章我们学习了init进程.Zygote进程和SyetemServer进程的启动过程,这一篇文章我们就来学习Android系统启动流程的最后一步:Launcher的启动流程,并结合本系列的前三篇 ...

  5. OneAPM NI 基于旁路镜像数据的真实用户体验监控

    在这个应用无处不在的时代,一次网络购物,一次网络银行交易,一次网络保险的购买,一次春运车票的购买,一次重要工作邮件的收发中出现的延时,卡顿对企业都可能意味着用户忠诚度下降,真金白银的损失. 因而感知真 ...

  6. Sql server 使用drop database 语句,无法删除正在使用的数据库的解决办法

    使用DROP DATABASE 删除数据库  显示“无法删除数据库 ,因为该数据库当前正在使用. 解决办法:在删除某一个数据库(下例中的“DB1”数据库)前,强制kill掉该数据库上的所有数据库连接. ...

  7. python 3.6 的 venv 模块

    今天,在在使用 pycharm 的使用,进行创建 python的时候,发现使用默认的创建的选项使用的python 3环境 .而我系统默认的python环境是 python 2.7 环境:这就引起了我的 ...

  8. No module named 'MySQLdb' Python3 + Django 2.0.3 + mysql 无法连接

    问题概览: 学习Django连接mysql数据库的时候遇到了问题 首先安装mysql(Python 3不支持MySQL-python): pip install pymysql 进入编辑 settin ...

  9. JDK5新特性之 可变参数的方法

    可变参数的方法:不知道这个方法该定义多少个参数 注意: > 参数实际上是数组 > 必须写在参数列表最后一个 package cn.itcast.day24.varparam; import ...

  10. SDN 第二次上机作业

    SDN第二次上机作业 1.控制器floodlight所示可视化图形拓扑的截图,及主机拓扑连通性检测截图 拓扑 连通性 2.利用字符界面下发流表,使得'h1'和'h2' ping 不通 流表截图 连通性 ...