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. linux下文件特殊权限设置位S和沾附位T(转载)

    今天在创建文件的时候,发现了文件权限末尾有个T,之前没留意过,后来又用c创建(open)了两个文件来查看,在我没有指定权限(省略open的第三个参数)的时候,有时还会出现S,虽然还没弄懂什么时候会出现 ...

  2. QuantumTunnel:协议路由 vs 端口路由

    本篇来聊一下内网穿透中流量转发的问题 内网穿透和核心逻辑是根据流量的路由信息准确地将公网流量路由到指定的机器端口上,从而完成一次流量的内网穿透. 这里有一个核心问题,路由信息从哪里获取? 常见的有将路 ...

  3. Mysql教程:(六)修改语句、、删除语句、字符查询like

    1.修改语句 update 表名 set  where 条件 mysql> update student set birth=1988,department='中文系' where id=901 ...

  4. PAT甲级1074 Reversing Linked List (25分)

    [程序思路] 先根据地址按顺序读入节点,入栈,当栈里的元素个数等于k时全部出栈,并按出栈顺序保存,最后若栈不为空,则全部出栈并按出栈的稀饭顺序保存,最后输出各节点 注意:输入的节点中有可能存在无用节点 ...

  5. RocketMQ源码详解 | Consumer篇 · 其一:消息的 Pull 和 Push

    概述 当消息被存储后,消费者就会将其消费. 这句话简要的概述了一条消息的最总去向,也引出了本文将讨论的问题: 消息什么时候才对被消费者可见? 是在 page cache 中吗?还是在落盘后?还是像 K ...

  6. 开源一个由.netcore/.net framework4.6开发的saas微商城+独立部署版本微小程序商城

    一.项目介绍 开源一款基于.NET4.6开发的一款完整的微信商城SAAS平台,前端支持小程序.h5,由前端商城,商户管理后台,平台管理后台三大块组成,sass功能完善,支持商户拖拽式零代码创建并提交上 ...

  7. python 字符串和时间格式(datetime)相互转换-

    2019-03-17 11:00:00格式转化 import datetime # str转时间格式: dd = '2019-03-17 11:00:00' dd = datetime.datetim ...

  8. Hi3516开发笔记(二):Hi3516虚拟机基础环境搭建之串口调试、网络连接以及sftp文件传输

    前言   搭建Hi3516的基础虚拟机,为交叉编译环境搭建前期工作.后续会编译一个基本的C语言程序Demo,在HI3516上跑.   虚拟机   开发本对虚拟机做了一些基本要求,如下图:    其实重 ...

  9. 一文理解Java-class字节码文件

    前言 java语言在其刚诞生之际喊出的口号--"Write Once,Run Anywhere",正是基于字节码(byte code)而存在的,java能够做到平台无关性,得力于这 ...

  10. 解决WSL2中Vmmem内存占用过大问题教程

    Windows的linux子系统最大占用可到本机器的80%,所以必须限制一下它的性能来达到优化目的 按下Windows + R 键,输入 %UserProfile% 并运行进入用户文件夹 新建文件 . ...