Python3 并发编程1
操作系统发展
穿孔卡片
- 一个计算机机房, 一次只能被一个卡片使用
批处理
将一批作业提交给操作系统后就不再干预,由操作系统控制它们自动运行
联机批处理系统: 在主机与输入机之间增加一个存储设备--磁带
脱机批处理系统: 增加一台不与主机相连而专门用于与输入/输出设备打交道的卫星机
多道技术(单核)
- 单道: 计算机内存中只运行一个程序
- 多道: 计算机内存中穿插运行多个程序
- 当前执行程序遇到I/O操作, CPU会转而运行其他程序
- 当前程序占用CPU时间过长, CPU也会运行其他程序
- 优点: 提高CPU的利用率
- 缺点: 程序的执行效率降低
并发与并行
- 并发: 在一个时间段内有多个程序在运行(分时交替)
- 并行: 在一个时间点有多个程序在运行
进程
程序与进程
- 程序: 有序的指令和数据的集合
- 进程: 程序关于某个数据集合的一次运行活动, 是系统进行资源分配和调度的基本单位
进程调度
- 先来先服务: 哪个进程先就绪就占用CPU, 进程阻塞或结束让出CPU
- 短作业优先: 预计执行时间短的进程优先
- 时间片轮转: 进程在就绪队列的等待时间与享受服务的时间成正比
- 多级反馈队列: 设置多个就绪队列, 分布赋予不同的优先级
进程的三个状态
- 就绪状态: 所有进程创建时都会进入就绪状态, 准备被调度
- 运行状态: 进程被调度后就会获得CPU执行, 成为运行状态
- 阻塞状态: 当进程遇到I/O操作时, 就会变为阻塞状态
同步和异步
面向被调用者的消息通知机制
同步: 被调用者得到结果再返回
异步: 被调用方先返回, 再执行, 得到结果后再通知调用者
阻塞与非阻塞
面向调用者的消息等待时的状态
阻塞: 在调用结果返回前, 当前线程会被挂起等待, 知道拿到调用结果才会继续进行
非阻塞: 在调用结果返回前, 可以继续进行其他操作
僵尸进程与孤儿进程
- 僵尸进程: 指的是子进程已经结束, 但PID还在, 未被回收
- 孤儿进程: 指的是子进程还在进行, 但父进程意外结束
守护进程
- 指的是主进程结束后, 该主进程产生的所有子进程跟着结束并回收
from multiprocessing import Process
from multiprocessing import current_process
import time
def task(name):
print(f'{name} started...', current_process().pid)
time.sleep(1)
print(f'{name} stopped...', current_process().pid)
if __name__ == '__main__':
p = Process(target=task, args=('bigb',))
p.daemon = True
p.start()
print('主进程')
# 主进程
Python中的进程操作
Process创建进程
from multiprocessing import Process
import time
def task(name):
print(f'{name}的任务开始执行!')
time.sleep(1)
print(f'{name}的任务已经结束!')
# 创建子进程时, 子进程会加载并执行父进程代码
if __name__ == '__main__':
# targent=执行函数的地址, args是该函数需要传入的参数
p = Process(target=task, args=('bigb',))
# 启动进程,并调用子进程中的p.run()
p.start()
print('主进程')
'''
主进程
bigb的任务开始执行!
bigb的任务已经结束!
'''
from multiprocessing import Process
import time
class MyProcess(Process):
def run(self):
print('子进程任务开始执行!')
time.sleep(1)
print('子进程任务已经结束!')
if __name__ == '__main__':
p = MyProcess()
# 启动进程,并调用子进程中的p.run()
p.start()
print('主进程')
'''
主进程
子进程任务开始执行!
子进程任务已经结束!
'''
p.join()主进程等待子进程终止
from multiprocessing import Process
import time
def task(name):
print(f'{name}的任务开始执行!')
time.sleep(1)
print(f'{name}的任务已经结束!')
if __name__ == '__main__':
p = Process(target=task, args=('bigb',))
p.start()
p.join()
print('主进程')
'''
bigb的任务开始执行!
bigb的任务已经结束!
主进程
'''
current_process().pid获取子进程pidos.getpid获取主进程pidtasklist | findstr pidcmd中查看pid属于哪个进程p.is_alive()判断p进程是否存活p.terminate()终止p进程
进程间数据相互隔离
from multiprocessing import Process
x = 1
def foo():
global x
x = 2
if __name__ == '__main__':
p = Process(target=foo)
p.start()
print(x) # 1
Python3 并发编程1的更多相关文章
- Python3 并发编程4
目录 Event事件 线程池与进程池 基本概念 使用方法 和信号量的区别 协程(coroutine) 基本概念 实现方式 多线程爬取梨视频 Event事件 用来控制线程的执行 e.isSet()查看对 ...
- Python3 并发编程3
目录 GIL全局解释器锁 基本概念 多线程的作用 死锁现象 递归锁 信号量 线程队列 GIL全局解释器锁 基本概念 global interpreter lock 全局解释器锁 GIL不是Python ...
- Python3 并发编程小练习
实现基于TCP协议套接字,服务端实现接收客户端的连接并发 # server.py import socket from threading import Thread server = socket. ...
- Python3 并发编程2
目录 进程互斥锁 基本概念 互斥锁的使用 IPC 基本概念 队列 生产者消费者模型 基本概念 代码实现 线程 基本概念 创建线程 线程互斥锁 进程互斥锁 基本概念 临界资源: 一次仅允许一个进程使用的 ...
- Python3 与 C# 并发编程之~ 进程篇
上次说了很多Linux下进程相关知识,这边不再复述,下面来说说Python的并发编程,如有错误欢迎提出- 如果遇到听不懂的可以看上一次的文章:https://www.cnblogs.com/dot ...
- Python3 与 C# 并发编程之~ 协程篇
3.协程篇¶ 去年微信公众号就陆陆续续发布了,我一直以为博客也汇总同步了,这几天有朋友说一直没找到,遂发现,的确是漏了,所以补上一篇 在线预览:https://github.lesschina.c ...
- Python3 与 C# 并发编程之~进程先导篇
在线预览:http://github.lesschina.com/python/base/concurrency/1.并发编程-进程先导篇.html Python3 与 C# 并发编程之- 进程篇 ...
- Python3 与 C# 并发编程之~ 线程篇
2.线程篇¶ 在线预览:https://github.lesschina.com/python/base/concurrency/3.并发编程-线程篇.html 示例代码:https://gith ...
- asyncio:python3未来并发编程主流、充满野心的模块
介绍 asyncio是Python在3.5中正式引入的标准库,这是Python未来的并发编程的主流,非常重要的一个模块.有一个web框架叫sanic,就是基于asyncio,语法和flask类似,使用 ...
随机推荐
- 阿里云开源 image-syncer 工具,容器镜像迁移同步的终极利器
为什么要做这个工具? 由于阿里云上的容器服务 ACK 在使用成本.运维成本.方便性.长期稳定性上大大超过公司自建自维护 Kubernets 集群,有不少公司纷纷想把之前自己维护 Kubernetes ...
- 一.web服务机制
web服务机制 我们先跟着**(Web服务器工作原理总体描述01)这张图,将一次Web服务的工作流程过一遍,我们假设以浏览器作为客户端(1) 用户做出了一个操作,可以是填写网址敲回车,可以是点击链接, ...
- poj 1679 The Unique MST (次小生成树(sec_mst)【kruskal】)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 35999 Accepted: 13145 ...
- 领扣(LeetCode)合并两个有序数组 个人题解
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n. ...
- expect 自动填充密码
它的脚本以#!/usr/bin/expect开头,执行时用expoct,而不是bash.我的一个给samba自动创建用户并且自动填写默认密码的脚本如下: vim smb_passwd.exp #!/u ...
- Pytorch文本分类(imdb数据集),含DataLoader数据加载,最优模型保存
用pytorch进行文本分类,数据集为keras内置的imdb影评数据(二分类),代码包含六个部分(详见代码) 使用环境: pytorch:1.1.0 cuda:10.0 gpu:RTX2070 (1 ...
- Alibaba Nacos 学习(二):Spring Cloud Nacos Config
Alibaba Nacos 学习(一):Nacos介绍与安装 Alibaba Nacos 学习(二):Spring Cloud Nacos Config Alibaba Nacos 学习(三):Spr ...
- mybatis源码学习(一) 原生mybatis源码学习
最近这一周,主要在学习mybatis相关的源码,所以记录一下吧,算是一点学习心得 个人觉得,mybatis的源码,大致可以分为两部分,一是原生的mybatis,二是和spring整合之后的mybati ...
- 使用laravel快速构建vuepress管理器
使用laravel快速构建vuepress管理器 介绍 刚刚学了下laravel感觉很方便,最近也在用vuepress做个人博客,但是感觉每次写文章管理文章不是特别方便,就使用laravel写了这个v ...
- 2019牛客暑期多校训练营(第九场) E All men are brothers
传送门 知识点:并查集+组合数学 并查集合并操作可以理解为使得两个集合的人互相成为朋友,也就是两个集合并在了一起,答案是要求从所有人中挑出四个互相不是朋友的四个人,比较基础的组合数学知识,但因为每个集 ...