进程的常用方法
时间:2019-09-12
本文章向大家介绍进程的常用方法,主要包括进程的常用方法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
进程的常用方法
一、常用方法
join():阻塞主进程,主进程会等待子进程结束后结束主进程
#单个进程
from multiprocessing import Process
import time
def Text():
print('子进程开始')
time.sleep(2)
print('子进程结束')
if __name__ == '__main__':
p = Process(target=Text)
p.start() #告诉操作系统子进程开始
p.join() #阻塞主进程,主进程会等待子进程结束后结束主进程
time.sleep(1)
print('主进程结束')
#多个进程
def Text(i):
print(f'子进程{i}开始')
time.sleep(1)
print(f'子进程{i}结束')
if __name__ == '__main__':
start = time.time()
for i in range(1,5):
p = Process(target=Text,args=(i,))
p.start() #告诉操作系统子进程开始
p.join() #阻塞主进程,主进程会等待子进程结束后结束主进程
time.sleep(1)
end = time.time()
print(end - start)
print('主进程结束')
搞这个程序我们把它搞成了串行,一个运行完另一个才能开始,跑着一个程序我们花了13.114991426467896,所以他失去了真正的意义
----------------------------------------------------------------------------------------
子进程1开始
子进程1结束
4.4081432819366455
……
子进程4开始
子进程4结束
13.114991426467896
主进程结束
def Text(i):
print(f'子进程{i}开始')
time.sleep(1)
print(f'子进程{i}结束')
if __name__ == '__main__':
p_list = [] #建立一个空列表
start = time.time()
for i in range(1, 5): #生成五个客户端
p = Process(target=Text,args=(i,))
p.start() #子进程开始
p_list.append(p) # 将对象分别追加到这个空列表中
for p in p_list:
p.join()
end = time.time()
print(end-start)
print('主进程结束')
这个才是真正的实现了并发,总共时间才用了2.6215157508850098秒,而且join()也发挥了真正的作用。
-----------------------------------------------------------------------------------------
子进程1开始
子进程2开始
子进程4开始
子进程3开始
子进程1结束
子进程2结束
子进程4结束
子进程3结束
2.6215157508850098
主进程结束
os.getpid():获取子进程的ID
os.getppid():获取子进程的父进程的ID
import os
from multiprocessing import Process,current_process
import time
def Text():
print('子进程开始')
print('子进程的pid:',os.getpid())
print('子进程的pid:',current_process().pid) #查看当前进程的pid
time.sleep(15)
print('子进程结束')
if __name__ == '__main__':
p = Process(target=Text)
p.start() #告诉操作系统子进程开始
time.sleep(1)
print('父进程的pid:',current_process().pid) #查看当前进程的pid
print('父进程的pid:',os.getpid()) #查看fu进程的pid
print('父进程的父进程的pid:',os.getppid()) #父进程的父进程的pid pycharm的pid
print('主进程结束')
#current_process().pid 写在什么进程下就查看什么进程的pid
# os.getpid() 写在什么进程下就查看什么进程的pid
current_process().name:查看当前进程的名字
def Text(i):
print('子进程开始')
time.sleep(0.2)
print('子进程结束')
print(current_process().name) #查看当前进程的进程名
if __name__ == '__main__':
for i in range(1,3):
p = Process(target=Text,args=(i,),name = str(i)) #name = i 进程的姓名可以更改,但姓名一定是字符串
p.start() #告诉操作系统子进程开始
p.join() #阻塞主进程,主进程会等待子进程结束后结束主进程
time.sleep(1)
print(current_process().name) # 查看当前进程的进程名
print('主进程结束')
.is_alive:查看进程是否还活着
def Text():
print('子进程开始')
time.sleep(0.1)
print('子进程结束')
if __name__ == '__main__':
p = Process(target=Text)
p.start() #告诉操作系统子进程开始
print(p.is_alive()) # 查看当前进程是否还活着 #True
time.sleep(3)
print(p.is_alive()) #查看当前进程是否还活着 #False 代码运行完了就算死了
print('主进程结束')
.terminate(): 直接终止子进程
def Text():
print('子进程开始')
time.sleep(20)
print('子进程结束')
if __name__ == '__main__':
p = Process(target=Text)
p.start() #告诉操作系统子进程开始
time.sleep(3) #让他睡三秒,让子进程先试一下,效果所需
p.terminate() #告诉操作系统直接终止子进程
print(p.is_alive()) # 查看当前进程是否还活着 #True
time.sleep(5)
p.join() #主进程等待子进程先结束
print(p.is_alive()) #查看当前进程是否还活着 #False 代码运行完了就算死了
print('主进程结束')
以下是得到的结果,无论子进程运行到哪里,只要执行p.terminate(),就立刻结束子进程
-------------------------------------------------------------------------
子进程开始
True
False
主进程结束
二、守护进程
守护进程可以比作是宫廷忠心耿耿的太监,只要皇帝死了,他就得陪葬,而皇帝就像是主进程。
守护进程的本质其实就是一个子进程
主进程的代码执行完毕守护进程直接结束。但是此时主进程可能没有结束
def Text():
print('子进程开始')
time.sleep(1.5)
print('子进程结束')
if __name__ == '__main__':
p = Process(target=Text)
p.daemon = True #将子进程设置为守护进程
p.start() #告诉操作系统子进程开始
time.sleep(2)
print('主进程结束')
并没有打印出'子进程结束'就说明子进程还没有结束,但是子进程已经随着主进程的代码执行结束而结束了
---------------------------------------------------------------------------------
子进程开始
主进程结束
原文地址:https://www.cnblogs.com/yanjiayi098-001/p/11515355.html
- async和enterproxy控制并发数量
- 从零开始写项目终极【维护网站、修复Bug】
- Redis 数据结构与内存管理策略(下)
- Redis 数据结构与内存管理策略(上)
- Servlet第三篇【request和response简介、response的常见应用】
- Java 10的10个新特性,将彻底改变你写代码的方式!
- JDK9新特性实战:简化流关闭新姿势。
- Druid数据库连接池就是这么简单
- 使用 github 做代码管理,知道这些就够了
- 二叉树就这么简单
- Elasticsearch就是这么简单
- 让 MyBatis Generator 变的更简单
- SpringMVC【参数绑定、数据回显、文件上传】
- SDNLAB技术分享(五):浅谈Open vSwitch移植
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 机器学习必刷题-手撕推导篇(1)
- Python面试必刷题系列(3)
- Spark Love TensorFlow
- 用GPU加速Keras模型——Colab免费GPU使用攻略
- __init__和__new__的对比及单例模式
- 数据结构高频面试题-树
- Python面试必刷题系列(5)
- 外卖小哥
- 用 Python可视化神器 Plotly 动态演示全球疫情变化趋势
- 2个范例带你读懂TensorFlow2低阶API构建模型方法
- 2个范例带你读懂中阶API建模方法
- 2个范例带你读懂高阶API建模方法
- Keras与经典卷积——50行代码实现minst图片分类
- 算法理论+实战之PCA降维
- Numpy中Meshgrid函数介绍及2种应用场景