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)的更多相关文章

  1. java代码中获取进程process id(转)

    另一方面,线程ID=进程ID+内部线程对象ID并不成立,    参考: blog.csdn.net/heyetina/article/details/6633901     如何在java代码中获取进 ...

  2. nodeJS之进程process对象

    前面的话 process对象是一个全局对象,在任何地方都能访问到它,通过这个对象提供的属性和方法,使我们可以对当前运行的程序的进程进行访问和控制.本文将详细介绍process对象 概述 process ...

  3. C# 进程Process基本的操作说明

    public int CallPhoneExe(string arg) //arg为进程的命令行参数 { WaitHandle[] waits =new WaitHandle[2]; //定义两个Wa ...

  4. Linux学习-什么是进程 (process)

    触发 任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个 ID ,称为 PID,同时依据启发这个进程的用户与相关属性关系,给予这个 PID 一组有效的权限设定.从此以后,这 个 PID ...

  5. Python_进程process 与 线程thread

    进程process  与 线程thread 的区别 各个进程独立使用内存空间,(默认)不可互相访问,线程共享内存 进程的子进程是复制一份父进程,线程没有

  6. 进程(process)和线程(thread)

    来源:阮一峰 进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握. 其实做一个很好的类比,就可以把它们解释地清晰易懂. 1.计算机的核心是CPU,它承担了所 ...

  7. 进程Process之join、daemon(守护)、terminate(关闭)、multiprocessing之锁、信号量和事件

    一.Process 参数介绍: 1 group参数未使用,值始终为None 2 target表示调用对象,即子进程要执行的任务 3 args表示调用对象的位置参数元组,args=(1,2,'a',) ...

  8. 《C#并发编程经典实例》学习笔记-进程(process)和线程(thread)

    本文主要参考自孙钟秀主编的<操作系统教程>一书中关于进程和线程的部分. 进程 为什么引入进程? 一,刻画系统动态性,发挥系统并发性,提高资源利用率. 以C#为例,在编辑器Visual St ...

  9. 第三十天- 进程 Process模块 空间隔离

    1.进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体: ...

随机推荐

  1. 内核驱动编译之Makefile shell pwd路径问题

    一般我们在写Makefile的时候为了获取到当前Makefile所在的文件夹路径,会使用TopDIR ?= $(shell pwd)来定义,后续的文件路径都是基于此TopDIR基础上使用. 今天在移植 ...

  2. 力扣 - 剑指 Offer 66. 构建乘积数组

    题目 剑指 Offer 66. 构建乘积数组 思路1 按照一般的思路就是将所有的相乘,然后除以每一位数字就是答案,但是题目要求我们不能使用除法,因此我们会想到每次遍历到每个数字的时候,在遍历一遍数组, ...

  3. 启用或禁用普通用户Exchange Online PowerShell功能

    默认情况下,允许在 Microsoft 365 中创建的所有帐户都可以使用 Exchange Online PowerShell.管理员可以使用 Exchange Online PowerShell ...

  4. JavaScript事件捕获冒泡与捕获

    事件流 JavaScript中,事件流指的是DOM事件流. 概念 事件的传播过程即DOM事件流.事件对象在 DOM 中的传播过程,被称为"事件流".举个例子:开电脑这个事,首先你是 ...

  5. LoadRunner12浏览器录制(谷歌火狐)

    一.使用谷歌浏览器 下载的版本 65.0.3325.162(正式版本)(64 位)安装之前要记得把电脑现有的谷歌浏览器卸载了. 1.下载地址:https://www.chromedownloads.n ...

  6. axios 基于拦截器的取消(重复)请求

    axios 基于拦截器的取消(重复)请求 // 添加请求拦截器 axios.interceptors.request.use((config) => { // 准备发请求之前, 取消未完成的请求 ...

  7. go输入Hello word

    package main import "fmt" func main() {     fmt.Println("hello word") } 输入hello ...

  8. celery config

    /* Useful celery config. app = Celery('tasks', broker='redis://localhost:6379', backend='redis://loc ...

  9. 史上最全的Excel导入导出之easyexcel

    喝水不忘挖井人,感谢阿里巴巴项目组提供了easyexcel工具类,github地址:https://github.com/alibaba/easyexcel 文章目录 环境搭建 读取excel文件 小 ...

  10. 动态代理中newProxyInstance中三个参数

     JDK Proxy(代理对象): Proxy.newProxyInstance 方法的三个参数创建代理对象 增强 person对象 使用代理对象代替person 去执行 doCourt方法参数1 类 ...