day28 进程(Process)
day28 进程(Process)
1、进程的概念
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
# 进程是系统进行资源分配和调度的基本单位
程序:做事的过程,而且是没有生命周期的,程序是永久的
进程:是动态的,是有生命周期的,进程是暂时的
协程:解决单线程下的高并发
# 进程中还可以开线程
线程就是干活的人,进程不是干活的人
线程就是最小的执行单元
进程和线程都是有操作系统来调度的
2、进程的并行和并发
一、进程的并行和并发
并行: 并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑(比如三个线程,四核的CPU)
并发:并发是指资源有限的情况下,两者交替轮流使用资源(比如单核CPU,只能两个人来回交替使用,目的是提高效率)
二、并行和并发的区别
并行是从微观上,就是在一个精确的时间片刻,有不同的程序在同时执行,这就要求必须有多个处理器。
并发是从宏观上,在一个时间段可以看出是同时执行的,# 但原理是多个程序来回交替使用的。
三、消耗
1. i/o消耗(i/o密集型)
input:输入
output:输出
不需要用到CPU的
比如:在一个网站下载文件,下载时间为3秒,这个过程及时i/o消耗
2.计算密集型
需要占用CPU
3、进程调度算法
一、先来先服务调度算法
先来先服务调度算法是一种最简单的调度算法,该算法既可以用于作业调度,也可用于进程调度。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。由此可知,本算法适合于CPU繁忙型作业,而不利于O/O繁忙型的作业(进程)。
二、短作业优先调度算法
短作业(进程)优先调度算法是指对短作业或短进程优先调度的算法,该算法既可用于作业调度,也可用于进程调度。
三、时间片轮转法
时间片轮转法的基本思路是让每个进程在就绪队列中的等待时间与享受服务的时间成比列。
4、同步异步阻塞和非阻塞
# 在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞。
1.同步与异步: 同步和异步关注的是消息通信机制
2. 阻塞与非阻塞:阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
同步:就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务才算完成,这是一种可靠序列。要么成功都成功,失败都失败,状态保持一致。
异步:是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了任务就算完成了。所以它是不可靠的任务序列。
通俗一点讲:同步 比喻成一个人去书店买书,问书店老板有没有这本书,书店老板给你找,而在这个过程中,你是一直在书店等待书店老板返回的结果。# 是一种效率低下的方式。
异步:让老板先找书,自己先去工作,找到书了给自己打电话,再来拿书。# 这是一种效率高的方式。
同步阻塞的方式:效率低下,只能等待返回结果,干不了其他事情
异步阻塞的方式:效率更高,在等待返回结果先干别的事情,返回结果再来干这件事。
5、如何开启进程
一、multiprocess模块:多功能的意思
分为四部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享。
二、multiprocess.process模块
process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。
代码:
from multiprocessing import Process
def write():
with open('aaa','w') as f:
f.write('hello')
# 一个进程必须至少有一个线程
# 在winds中,开启进程必须写在__main__里面
if __name__ == '__main__':
p = Process(target=weite)
# 开启进程必须调用start方法
p.start()
6、process类的参数
参数介绍:
1.group参数未使用,值始终为None
2.target表示调用对象,即子进程要执行的任务
3.args表示调用对象的位置参数元祖,args=(1,2,'meng')
4.kwargs表示调用对象的字典,kwargs={'name':'meng','age':18}
5.naem为子进程的名称
from multiprocessing import Process
def task(age, name):
# with open('aaa', 'w') as f:
# f.write('hello')
print(name)
print(age)
# 一个进程中必须至少有一个线程
# 在wins中,开启进程必须写在__main__里面
if __name__ == '__main__':
"""
target=None, name=None, args=(), kwargs={},
*, daemon=None
"""
# p = Process(target=write, name='meng')
# p = Process(target=task, args=('meng', 18))
p = Process(target=task, kwargs={'name': 'meng', 'age': 18})
# 开启进程必须调用start方法
p.start()
print(p.name) # 进程名:Process-1
7、process类的方法
方法:
1.p.start():启动进程,并调用该子进程中的p.run()
2.p.run():进程启动时运行的方法,正是它去调用target指定的函数、
3.p.terminate():强制终止进程p,不会进行任何操作。
4.p.is_alive():如果p仍在运行,返回True
5.p.join():等子进程运行完在执行,注意:p.join只能在statr开启的进程,不能在run开启的进程
代码:
from multiprocessing import Process
import time
def task(age, name):
# with open('aaa', 'w') as f:
# f.write('hello')
print(name)
# print(age)
# 一个进程中必须至少有一个线程
# 在wins中,开启进程必须写在__main__里面
if __name__ == '__main__':
p = Process(target=task, kwargs={'name': 'meng', 'age': 18})
# 开启进程必须调用start方法
p.start()
# # p.run() # 也可以开启进程
# print(p.is_alive()) # 判断这个进程是否存活,结果True
# time.sleep(2)
# p.terminate() # 杀死这个进程
print(p.is_alive()) # 结果False
p.join() # 等待子进程执行完毕再执行
'''
子进程
父进程
'''
print('=====>')
8、process类的属性介绍
属性介绍:
1.p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置
2.p.name:进程的名称
3.p.pid:进程的pid
4.p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)
5.p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)
代码:
from multiprocessing import Process
import time
def task(age, name):
# with open('aaa', 'w') as f:
# f.write('hello')
# print(name)
# print(age)
time.sleep(2)
print(name)
# 一个进程中必须至少有一个线程
# 在wins中,开启进程必须写在__main__里面
if __name__ == '__main__':
p = Process(target=task, kwargs={'name': 'meng', 'age': 18})
'''
守护进程:父进程执行完毕,子进程也立即结束
'''
p.daemon = True # 强调:一定要放在start之前
# 正常输出Process-1,meng。 加上p.demon不会运行meng,直接运行print(p.name)
# 开启进程必须调用start方法
p.start()
print(p.pid) # 可以查看子进程的pid
print(p.name) # 进程名:Process-1
9、获取进程id号
代码:
from multiprocessing import Process
import os
import time
def task(name,age):
print('子进程的id号:%s'% os.getpid())
print('父进程的id号:%s'% os.getppid())
time.sleep(10)
if __name__ == '__main__':
p = Process(target = task,kwargs={'name':'meng','age':18})
p.start()
print(p.pid)
print('main里的主进程的id号:%s'% os.getpid())
print('main里的父进程的id号:%s'% os.getppid())
time.sleep(10)
print('====>')
输出结果:可以打开资源管理器看看
33540
main里的主进程的id号:32680
main里的父进程的id号:28896
子进程的id号:33540
父进程的id号:32680
====>
10、开启多进程
代码:
from multiprocessing import Process
import time
import os
def task(i):
time.sleep(2)
print(i)
if __name__ == '__main__':
l = []
for i in range(10):
p = Process(target=task,args=(i,))
p.start()
l.append(p)
for j in l:
j.join()
# 开启10次进程
day28 进程(Process)的更多相关文章
- java代码中获取进程process id(转)
另一方面,线程ID=进程ID+内部线程对象ID并不成立, 参考: blog.csdn.net/heyetina/article/details/6633901 如何在java代码中获取进 ...
- nodeJS之进程process对象
前面的话 process对象是一个全局对象,在任何地方都能访问到它,通过这个对象提供的属性和方法,使我们可以对当前运行的程序的进程进行访问和控制.本文将详细介绍process对象 概述 process ...
- C# 进程Process基本的操作说明
public int CallPhoneExe(string arg) //arg为进程的命令行参数 { WaitHandle[] waits =new WaitHandle[2]; //定义两个Wa ...
- Linux学习-什么是进程 (process)
触发 任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个 ID ,称为 PID,同时依据启发这个进程的用户与相关属性关系,给予这个 PID 一组有效的权限设定.从此以后,这 个 PID ...
- Python_进程process 与 线程thread
进程process 与 线程thread 的区别 各个进程独立使用内存空间,(默认)不可互相访问,线程共享内存 进程的子进程是复制一份父进程,线程没有
- 进程(process)和线程(thread)
来源:阮一峰 进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握. 其实做一个很好的类比,就可以把它们解释地清晰易懂. 1.计算机的核心是CPU,它承担了所 ...
- 进程Process之join、daemon(守护)、terminate(关闭)、multiprocessing之锁、信号量和事件
一.Process 参数介绍: 1 group参数未使用,值始终为None 2 target表示调用对象,即子进程要执行的任务 3 args表示调用对象的位置参数元组,args=(1,2,'a',) ...
- 《C#并发编程经典实例》学习笔记-进程(process)和线程(thread)
本文主要参考自孙钟秀主编的<操作系统教程>一书中关于进程和线程的部分. 进程 为什么引入进程? 一,刻画系统动态性,发挥系统并发性,提高资源利用率. 以C#为例,在编辑器Visual St ...
- 第三十天- 进程 Process模块 空间隔离
1.进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体: ...
随机推荐
- 转载:使用Xilinx IP核进行PCIE开发学习笔记(一)简介篇
https://zhuanlan.zhihu.com/p/32786076 最近接触到一个项目,需要使用PCIE协议,项目要求完成一个pcie板卡,最终可以通过电脑进行通信,完成电脑发送的指令.这当中 ...
- 在c中使用正则表达式
今天学习编译原理的时候,用c写一个简易的文法识别器实验遇到了一个问题:要用正则表达式去识别正则文法里面的A->ω,A->Bω, 其中ω属于T的正闭包,也就是说我们对正则文法的产生式进行抽象 ...
- 表示数值的字符串 牛客网 剑指Offer
表示数值的字符串 牛客网 剑指Offer 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2"," ...
- 访问所有HTTPS网站显示连接不安全 (火狐浏览器)
当 Firefox 连接到一个安全的网站时(网址最开始为"https://"),它必须确认该网站出具的证书有效且使用足够高的加密强度.如果证书无法通过验证,或加密强度过低,Fire ...
- (三)FastDFS 高可用集群架构学习---Client 接口开发
一.Python3 与 FastDFS 交互 1.安装 py3fdfs模块 # pip3 install py3Fdfs 2.测试使用 py3Fdfs 与 Fastdfs 集群交互(上传文件) fro ...
- Docker 搭建 Jenkins 持续集成自动化构建环境
1.Docker镜像拉取 Jenkins 环境命令 docker pull jenkins/jenkins:lts 查看下拉取的镜像 docker images 2.通过容器编排方式构建 Jenkin ...
- Downward API —— 在容器内部获取 Pod 信息
我们知道,每个 Pod 在被超过创建出来之后,都会被系统分配唯一的名字.IP地址,并且处于某个 Namespace 中,那么我们如何在 Pod 的容器内获取 Pod 的这些重要信息呢? 答案就是使用 ...
- 直播预告|App 首页如何动态化更新?来看蚂蚁技术专家详解「支付宝」全新卡片技术栈
立即前往直播间预约观看 从icon到card,一场内容前置化的变革 从 Windows 时代开始,应用程序图标就成为了用户(流量)的主入口,一直持续到移动端时代. 图标即入口的方式,虽然足够方便但却不 ...
- CURD系统怎么做出技术含量--怎样引导面试
引子 很多朋友可能会因为自己做的工作不是特别核心或者业务简单而引起面试中没有自信.但是很多公司面试的时候是可以接受面试者之前岗位的并发量.交易量低一些的.比如我们要招聘和我们交易量同等级或者以上的出来 ...
- Java开发介绍之JDK JRE JVM 和 环境变量配置
一.JDK>JRE>JVM JDK(Java Development Kit):Java开发工具包 JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和 ...