03并发编程(多道技术+进程理论+进程join方法)
并发编程
网络发展史(了解即可)
"""学习并发编程其实就是在学习操作系统的发展史(底层逻辑)"""
1.穿孔卡片时代
CPU的利用率极低
2.联机批处理系统
将多个程序员的程序一次性录入磁带中 之后交由输入机输入并由CPU执行
3.脱机批处理系统
现代计算机的雏形(远程输入 高速磁带 主机)
多道技术
# 前提:单核CPU
多道技术
切换+保存状态
"""
CPU工作机制
1.当某个程序进入IO状态的时候 操作系统会自动剥夺该程序的CPU执行权限
2.当某个程序长时间占用CPU的时候 操作系统也会剥夺该程序的CPU执行权限
"""
并行与并发(******)
并行:多个程序同时执行
并发:多个程序只要看起来像同时运行即可
# 问:单核CPU能否实现并行
肯定不能,但是可以实现并发
# 问:12306可以同一时间支持几个亿的用户买票 问是并行还是并发
肯定是并发(高并发)
星轨:微博能够支持八个星轨

进程理论
# 进程与程序的区别
程序:一堆代码(死的)
进程:正在运行的程序(活的)
# 单核情况下的进程调度
进程调度算法演变
1.FCFS 先来先服务
对短作业不友好
2.短作业优先调度算法
对长作业不友好
3.时间片轮转法+多级反馈队列
'''(面试官提问时,需图文结合)'''
先分配给新的多个进程相同的时间片
之后根据进程消耗的时间片多少分类别......
# 进程三状态图(******)
就绪态 运行态 阻塞态
进程要想进入运行态必须先经过就绪态
# 同步与异步(******)
'''用于描述任务的提交方式'''
同步:提交完任务之后原地等待任务的返回结果 期间不做任何事
异步:提交完任务之后不原地等待任务的返回结果 直接去做其他事 结果由反馈机制自动提醒
# 阻塞与非阻塞(******)
'''用于描述任务的执行状态'''
阻塞:阻塞态
非阻塞:就绪态 运行态
进程三状态图:

时间片轮转法+多级反馈队列:

创建进程
# 代码层面创建进程
from multiprocessing import Process
import time
import os
def test(name):
print(os.getpid()) # 获取进程号
print(os.getppid()) # 获取父进程号
print('%s正在运行' % name)
time.sleep(3)
print('%s已经结束' % name)
if __name__ == '__main__':
p = Process(target=test, args=('jason',)) # 生成一个进程对象
p.start() # 告诉操作系统开设一个新的进程 异步提交
print(os.getpid())
print('主')
"""
在windows中开设进程类似于导入模块
从上往下再次执行代码
一定需要在__main__判断语句内执行开设进程的代码
在linux中是直接将代码完整的复制一份执行
不需要在__main__判断语句内执行
"""
class MyProcess(Process):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print('%s正在运行' % self.name)
time.sleep(3)
print('%s已经结束' % self.name)
if __name__ == '__main__':
p = MyProcess('jason')
p.start()
print('主')
进程的join方法
from multiprocessing import Process
import time
def test(name, n):
print('%s is running' % name)
time.sleep(n)
print('%s is over' % name)
if __name__ == '__main__':
p_list = []
start_time = time.time()
for i in range(1, 4):
p = Process(target=test, args=(i, i))
p.start()
p_list.append(p)
# p.join() # 串行 9s+
for p in p_list:
p.join()
print(time.time() - start_time)
# p = Process(target=test, args=('jason',))
# p1 = Process(target=test, args=('kevin',))
# p2 = Process(target=test, args=('oscar',))
# p.start()
# p1.start()
# p2.start()
print('主进程')
进程间默认无法交互
# 进程间数据是相互隔离的
from multiprocessing import Process
money = 100
def test():
global money
money = 999
if __name__ == '__main__':
p = Process(target=test)
p.start()
# 先确保子进程运行完毕了 再打印
p.join()
print(money)
对象方法
"""
1.current_process查看进程号
2.os.getpid() 查看进程号 os.getppid() 查看父进程进程号
3.进程的名字,p.name直接默认就有,也可以在实例化进程对象的时候通过关键字形式传入name=''
3.p.terminate() 杀死子进程
4.p.is_alive() 判断进程是否存活 3,4结合看不出结果,因为操作系统需要反应时间。主进程睡0.1即可看出效果
"""
03并发编程(多道技术+进程理论+进程join方法)的更多相关文章
- Java并发编程75道面试题及答案
1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...
- python并发编程02 /多进程、进程的创建、进程PID、join方法、进程对象属性、守护进程
python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 目录 python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 ...
- python全栈开发 * 进程理论 进程创建 * 180724
一.进程理论 1.进程是资源分配的最小单位. 2.进程调度就是多个进程在操作系统的控制下被CPU执行,去享用计算机的资源. 先来先服务 短作业优先 时间片轮转 多级反馈队列 3.进程调度的过程是不能够 ...
- Python编程-多道技术和进程
一.多道技术 1.多路复用 操作系统主要使用来 记录哪个程序使用什么资源 对资源请求进行分配 为不同的程序和用户调解互相冲突的资源请求. 我们可将上述操作系统的功能总结为: 处理来自多个程序发起的多个 ...
- 8.9 day30 并发编程 进程理论 进程方法 守护进程 互斥锁
多道技术 1.空间上的复用 多个程序共用一套计算机硬件 多道技术原理 2.时间上的复用 切换+保存状态 1.当一个程序遇到IO操作 操作系统会剥夺该程序的CPU执行权限( 提高了CPU的利用率 ...
- python并发编程-进程理论-进程方法-守护进程-互斥锁-01
操作系统发展史(主要的几个阶段) 初始系统 1946年第一台计算机诞生,采用手工操作的方式(用穿孔卡片操作) 同一个房间同一时刻只能运行一个程序,效率极低(操作一两个小时,CPU一两秒可能就运算完了) ...
- Java并发编程73道面试题及答案
原文出处:https://blog.csdn.net/qq_34039315/article/details/7854931 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线 ...
- Java并发编程73道面试题及答案 —— 面试稳了
今天主要整理一下 Java 并发编程在面试中的常见问题,希望对需要的读者有用. 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任 ...
- 《C#并发编程经典实例》学习笔记-进程(process)和线程(thread)
本文主要参考自孙钟秀主编的<操作系统教程>一书中关于进程和线程的部分. 进程 为什么引入进程? 一,刻画系统动态性,发挥系统并发性,提高资源利用率. 以C#为例,在编辑器Visual St ...
随机推荐
- Selenium_POM架构(17)
POM是Page Object Model的简称,它是一种设计思想,意思是,把每一个页面,当做一个对象,页面的元素和元素之间操作方法就是页面对象的属性和行为. POM一般使用三层架构,分别为:基础封装 ...
- Centos 7.6关闭selinux
查看selinux状态 [root@localhost ~]# sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SE ...
- linux获取 GPG 密钥失败
实质性问题就是自己系统没有yum的GPG密钥 查看自己系统版本 cat /etc/issue 登陆mirrors.163.com 找到自己系统对应的密钥 RPM-GPG-KEY-CentOS-3 ...
- vue实现引用less,sass全局变量
1.npm install sass-resources-loader --save-dev: 2.build/utils.js中,修改 function resolveResource(name) ...
- css编写规则BEM
简单来说,格式如下: .block { /* styles */ } .block__element { /* styles */ } .block--modifier { /* styles */ ...
- [源码分析] Facebook如何训练超大模型---(1)
[源码分析] Facebook如何训练超大模型---(1) 目录 [源码分析] Facebook如何训练超大模型---(1) 0x00 摘要 0x01 简介 1.1 FAIR & FSDP 1 ...
- 【记录一个问题】铁威马NAS存储中的人人影视APP,其WEB服务占满一个CPU核
终端登录后,top命令发现rrshareweb这个进程把单个CPU核占满了. 发现其实是人人影视的web服务,而这个服务里面我还根本未使用. 卸载这个app后正常.
- Xamarin/Unity3d无法访问Azure服务器或者微软API
Xamarin因为是mono项目的商用版,mono项目是.net技术的开源修改版,所以和微软的服务对接时候会出现安全验证问题. mono项目本质是对汇编级的中间语言二次编译.可参考公共语言运行时相关知 ...
- unity3d百度语音合成mp3流转换byte[]失败
using (Stream stream = response.GetResponseStream()) { buffer2 = new byte[stream ...
- Servlet-请求转发
Servlet-请求转发 请求转发:服务器收到请求后,从一个资源跳转到另一个资源的操作叫请求转发 请求转发特点: 1,浏览器地址栏没有变化 2,他们是一次请求 3,他们共享Request域中的数据 4 ...