day34
今日内容:
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的更多相关文章
- Spark Streaming揭秘 Day34 解析UI监听模式
Spark Streaming揭秘 Day34 解析UI监听模式 今天分享下SparkStreaming中的UI部分,和所有的UI系统一样,SparkStreaming中的UI系统使用的是监听器模式. ...
- BroadcastReceiver和Intetnt的理解 Day34
BroadcastReceiver和Intetnt的理解 Day34 mobile4.0 短信监控 问题堆栈 1. 下载开源项目View.网址自己fork一下 2. ContentProvider原理 ...
- day34——僵尸进程和孤儿进程、互斥锁、进程之间的通信
day34 僵尸进程和孤儿进程 基于unix环境(linux,macOS) 主进程需要等待子进程结束之后,主进程才结束 主进程时刻监测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收 ...
- day34 并行并发、进程开启、僵尸及孤儿进程
day34 并行并发.进程开启.僵尸及孤儿进程 1.并行与并发 什么是并行? 并行指的是多个进程同时被执行,是真正意义上的同时 什么是并发? 并发指的是多个程序看上去被同时执行,这是因为cpu在多个程 ...
- day34 前端基础之JavaScript
day34 前端基础之JavaScript ECMAScript 6 尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,当然,也不是唯一被标准化的部分.实际上 ...
- 兼容,原来在这里就已经開始--------Day34
看了两天,算是将w3cschool的javascript部分浏览了一遍.在脑海中大约有了一点概念,也才真切体会到:一入江湖深似海.欲穷此路难上难啊,至少如今看起来是遥遥无期.太多不懂, 太多茫然,只是 ...
- day34 基于TCP和UDP的套接字方法 粘包问题 丢包问题
TCP 基于流的协议 又叫可靠性传输协议 通过三次握手 四次挥手 来保证数据传输完毕 缺点效率低 正因为是基于流的协议 所以会出现粘包问题粘包问题:原因一:是应为数据是先发送给操作系统,在操作系统中有 ...
- day34 GIL锁 线程队列 线程池
一.Gil锁(Global Interpreter Lock) python全局解释器锁,有了这个锁的存在,python解释器在同一时间内只能让一个进程中的一个线程去执行,这样python的多线程就无 ...
- day34进程相关
进程1 什么是进程 进程指的是一个正在进行/运行的程序,进程是用来描述程序执行过程的虚拟概念 进程vs程序 程序:一堆代码 进程:程序的执行的过程 进程的概念起源于操作系 ...
随机推荐
- js之展开收缩菜单,用到window.onload ,onclick,
目标效果:点击标签1,如果列表标签的style的display是block,改成none,否则改成block,来达到展开收缩菜单效果 一.准备阶段 html文件 <!DOCTYPE html&g ...
- 常见Java问题二
1.什么是B/S架构?什么是C/S架构? B/S browser/server Web应用程序 C/S Client/Server 桌面应用程序 2.String str="www" ...
- Intellij Idea出现 unable to establish loopback connection
项目一运行就出现这个情况,好几次了,最后发现只要防火墙关闭,项目就可以运行成功.错误提示:“C:\Program Files\Java\jdk1.8.020\bin\java” -Xmx700m -D ...
- 在JavaScript文件中用ajax方法实现省市区的三级联动
1.JavaScript Document $(document).ready(function(e) { 加载三个下拉列表 $("#sanji").html("< ...
- JavaScript Data.parse()转化时间戳安卓和ISO不兼容
Data.parse()获取时间戳,在Android是没有问题的,但是在ISO就不行了,原因在于转化成时间戳的时间格式不一样. Android的格式是如“2017-12-12 12:12:12”,IS ...
- 解决webview调用 goBack() 返回上一页自动刷新闪白的情况
问题是:重写了onKeyDown()方法使其goBack(),但是遇到的问题是,每次进入webview再次返回原始页面的时候,中间会有一个闪白的出现. 试了好多网上的方法,发现都是扯淡. 后来意识到, ...
- WebView动态注入JavaScript脚本
Demo地址:https://gitee.com/chenyangqi/YouMeDai 背景介绍 在Android与JavaScript交互一文中学习了原生和JS交互,但是如果我们想和别人开发好的w ...
- Java实现后缀表达式建立表达式树
概述 表达式树的特点:叶节点是操作数,其他节点为操作符.由于一般的操作符都是二元的,所以表达式树一般都是二叉树. 根据后缀表达式"ab+cde+**"建立一颗树 文字描述: 如同后 ...
- 004-React-Native--多图选择上传
参考资料:http://www.jianshu.com/p/488e62ed9656 一:使用react-native-image-crop-picker进行图片选择时,并没有提供多图的机制.当你从相 ...
- Mongodb的入门(4)mongodb3.6的索引
Mongodb的索引: 在介绍索引之前,再强调一下nosql数据库和sql数据库的区别: sql数据库:结构化数据,定好了表格后,每一行的内容都是结构化的 mongo:文档数据,表下的数据都可以有自己 ...