今日内容:

  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. 设计模式原则(6)--Open-Closed Principle(OCP)--开闭原则

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.定义: 一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进行扩展. 2.使用场 ...

  2. linux vim 行缩进,批量移动多行

    显示行号用::set nu :49>5  从第49行开始,连接5行右移一个tab. :49,93>   从第49行开始到93行右移一个tab 选中多行,然后移动 https://jingy ...

  3. FineReport单行与数据库交互的方法

    1.   问题描述 我们在做一张报表填报的时候经常会遇到需要在一行进行添加动作,将该行数据直接与数据库交互,执行存储过程过程.我们可以通过每一行增加帆软“插入”按钮实现插入动作,并且在控件事件中增加和 ...

  4. Nginx的location剖析

    1.location的作用: location指令的作用是根据用户的请求的URL来执行不同的应用 2.location的语法: location [ = | ~ | ~* | ^~ ] uri { . ...

  5. 【Redis】Redis学习(四) Redis Sentinel模式详解

    主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel应运而生. Redis Sentinel是Redis官方提供的集群管理工具,主要有三大 ...

  6. python基础学习14----正则表达式

    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 在python中正则表达式被封 ...

  7. [Spark Core] Spark 在 IDEA 下编程

    0. 说明 Spark 在 IDEA 下使用 Scala  & Spark 在 IDEA 下使用 Java 编写 WordCount 程序 1. 准备 在项目中新建模块,为模块添加 Maven ...

  8. django版本切换以及更改url(pycharm)

    Django版本切换:https://blog.csdn.net/weixin_42305814/article/details/80742090 因为是从2版本更改到1版本,所以里面一些东西需要变动 ...

  9. 关于在Win10的Windows功能中没有IE11的问题

    大概是用Win7的时候把IE关掉了,升级Win10之后就发现IE不见了,在Windows功能里面也没有:最近因为某些原因需要用到IE,还是用的虚拟机. 网上找到的方法普遍是执行命令:FORFILES ...

  10. scss 使用

    SCSS 常用功能 https://www.cnblogs.com/guangzan/p/10547335.html 定义变量$my-color: #666; //定义变量$my-heihgt: 10 ...