进程的常用方法
时间:2019-09-16
本文章向大家介绍进程的常用方法,主要包括进程的常用方法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、常用方法
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() #阻塞主进程,主进程会等待子进程结束后结束主进程
print('主进程结束')
#多个进程
from multiprocessing import Process
import time
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() # 阻塞主进程,主进程会等待子进程结束后结束主进程
end = time.time()
print(end - start)
print('主进程结束')
搞这个程序我们把它搞成了串行,一个运行完另一个才能开始,跑着一个程序我们花了6.954221963882446秒,所以他失去了真正的意义
----------------------------------------------------------------------------------------
子进程1开始
子进程1结束
。。。
子进程4开始
子进程4结束
6.954221963882446
主进程结束
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('主进程结束')
并没有打印出'守护进程结束'就说明子进程还没有结束,但是子进程已经随着主进程的代码执行结束而结束了
---------------------------------------------------------------------------------
守护进程开始
主进程结束
#多个进程
from multiprocessing import Process
import time
def Text1():
print('守护进程开始')
time.sleep(2)
print('守护进程结束')
def Text2(): #再定义一个子进程
print('子进程开始')
time.sleep(1.5)
print('子进程结束')
if __name__ == '__main__':
p1 = Process(target=Text1)
p2 = Process(target=Text2)
p1.daemon= True #将Text设置为守护进程
p1.start() #告诉操作系统子进程开始
p2.start() #告诉操作系统子进程开始
time.sleep(2)
print('主进程结束')
以下并没有打印守护进程结束,就说明主进程代码执行完毕的时候,守护进程随即结束
---------------------------------------------------------------------------------
守护进程开始
子进程开始
主进程结束
子进程结束
原文地址:https://www.cnblogs.com/lulingjie/p/11529109.html
- Silverlight制作逐帧动画 v2 - part2
- Nodejs学习笔记(四)--- 与MySQL交互(felixge/node-mysql)
- 学习Spark——环境搭建(Mac版)
- 离线网络环境下一键式部署
- WCF后续之旅(17):通过tcpTracer进行消息的路由
- Linux同步机制(一) - 线程锁
- Silverlight类库介绍-FJCore
- 大型网站的自强之路
- 人工智能:浮现
- 机器人进化 如何确保 安全概率?
- Nodejs学习笔记(七)--- Node.js + Express 构建网站简单示例
- 如何写出好代码
- Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
- WCF后续之旅(15): 逻辑地址和物理地址
- 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 数组属性和方法
- 蓝桥杯突击复习准备——部分算法汇总
- 小解c# foreach原理
- 多包依赖管理--Lerna
- Flume概述
- Flume中常见的组件
- 程序员进阶之算法练习(四十八)LeetCode
- [C#]不通过事件方式获取键盘按钮按下的状态
- 15.深入k8s:Event事件处理及其源码分析
- SwiftUI:使用计时器重复触发事件
- SwiftUI:获取应用进入后台的通知
- Windows格式化namenode报错 - Error: JAVA_HOME is incorrectly set. Please update F:hadoopconfhadoop-e...
- Windows格式化namenode报错 - ERROR namenode.NameNode: Failed to start namenode.
- Windows启动HDFS报错 - 系统找不到文件 hadoop。
- Windows启动HDFS报错 - org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
- Windows启动HDFS报错 - Could not locate Hadoop executable: E:soft_workhadoop-2.6.0binwinutils.exe