Python学习笔记九
Python学习笔记之九
为什么要有操作系统
管理硬件,提供接口。
管理调度进程,并且将多个进程对硬件的竞争变得有序。
操作系统发展史
第一代计算机:真空管和穿孔卡片
没有操作系统,所有的程序设计直接操控硬件
优点:程序员独享整个资源
缺点:浪费资源
第二代计算机:晶体管和批处理系统
优点:计算机资源利用
缺点:程序员共享资源,出现问题,找不出问题,影响开发效率
第三代计算机:集成电路芯片和多道程序设计
多道程序:cpu执行程序的过程中遇到I/O,不会原地等待,cpu会去执行其他命令,等到程序执行完I/O.(时间上的复用)
实现一个看起来像并发。CPU随时切换进程。会影响CPU执行效率。
进程占用一个内存空间,每个进程的内存空间,是隔离的。(空间上的复用)
第四代计算机:个人计算机
多道技术:
产生背景:针对单核,实现并发。
空间复用:内存空间是隔离的
时间复用:遇到I/O就切,提高效率
遇到运行时间过长,不提高效率
并发与并行
并发:伪并行,单个CPU+多道技术,看起来像同时运行。
并行:多个CPU才能实现并行
windows和linux创建进程:
windows: createprocess创建进程的接口
linux: fork创建进程的接口
创建子进程:
linux:子进程是父进程的完整副本,
windows:父进程与子进程的内存地址有所不同
进程状态:
运行
阻塞:碰到I/O,便要让出CPU让其他进程执行,保证CPU一直在工作。
就绪:时刻准备着运行

开启进程的两种方式:
为什么开启子进程就实现了并发?
开启子进程就为了执行自己的任务,而不会因为父进程阻塞,而影响自己。
开启子进程的第一种方法:
from multiprocessing import Process
import time,random
def piao (name):
print('%s is piaoing' %name)
# time.sleep(3000)
if __name__ == '__main__':
# p=Process(target=piao,args=('alex',))
p=Process(target=piao,kwargs={'name':'alex'})
p.start() #向操作系统发送开启子进程的信号
# p.join()
print ('主进程')
结果:
"D:\Program Files\Python36\python.exe" C:/Users/yangjianbo/PycharmProjects/untitled/第九课并发编程/开启子进程.py
主进程
alex is piaoing
结论:
p.start() 只是向操作系统发出一个开启子进程的信号,而不是真正的开启子进程。
当p.start()执行完以后,会立刻执行下一行代码,也就是print(),而不是等待子进程执行后,再执行print().
p.start()只能执行一次,多次会有报错。
上面的例子:如果我想要子进程执行完毕以后,再执行print(),如何实现?
子进程执行完,再执行主进程的代码。
from multiprocessing import Process
import time,random
def piao (name):
print('%s is piaoing' %name)
# time.sleep(3000)
if __name__ == '__main__':
# p=Process(target=piao,args=('alex',))
p=Process(target=piao,kwargs={'name':'alex'})
p.start() #向操作系统发送开启子进程的信号
p.join()
print ('主进程')
结果:
"D:\Program Files\Python36\python.exe" C:/Users/yangjianbo/PycharmProjects/untitled/第九课并发编程/开启子进程.py
alex is piaoing
主进程
结论:在p.start()后面添加一个p.join(),主进程就会在当前位置停下,等待子进程运行完成,再执行后面的代码。p.join()必须在p.start()的后面,否则子进程还未开启,p.join()也没有意义。这么做的意义就是为了防止主进程突然关闭,而导致子进程执行完毕以后,成为了僵尸进程。
开启子进程的第二种方法:
采用自定义类的方式。
from multiprocessing import Process
import time,random
class Myprocess(Process):
def __init__(self,name):
super(Myprocess,self).__init__()
self.name=name
def run(self):
print ('%s is piaoing' %self.name) if __name__ == '__main__':
p=Myprocess('alex')
p.start()
print('主')
套接字通信开启子进程
服务端:
from socket import socket
from multiprocessing import Process
def tongxin(conn,addr):
while True:
try:
cmd = conn.recv(1024) # 收消息,限制单个消息的最大数为1024字节
if not cmd: break
conn.send(cmd.upper())
except ConnectionResetError:
break
conn.close()
def lianjie():
s = socket()
s.bind(('127.0.0.1', 8080)) # 插卡,指定服务器的IP地址和端口号
s.listen(5)
while True:
conn, client_addr = s.accept()
p=Process(target=tongxin,args=(conn,client_addr))
p.start()
s.close() if __name__ == '__main__':
lianjie()
客户端:
import socket
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8080)) #打电话 while True:
cmd=input('数据>>').strip()
if not cmd:continue
client.send(cmd.encode('utf-8')) #发消息
recv=client.recv(1024).decode('gbk') #收消息
print(recv) client.close()
进程对象的其他方法:
join方法:
from multiprocessing import Process
import time,random
def piao (name):
print('%s is piaoing' %name) if __name__ == '__main__':
p1=Process(target=piao,args=('alex',))
p2=Process(target=piao,args=('egon',))
p3 = Process(target=piao, args=('wupaiqi',))
p1.start()
p2.start()
p3.start() p1.join()
p2.join()
p3.join()
print ('主进程')
结果:
"D:\Program Files\Python36\python.exe" C:/Users/yangjianbo/PycharmProjects/untitled/第九课并发编程/进程的其他对象方法.py
egon is piaoing
alex is piaoing
wupaiqi is piaoing
主进程
结论:
三个start()都是随机开启的,不会按顺序启动的。
三个join要放在三个start的后面,这样才是并发。
from multiprocessing import Process
import time,random
def piao (name):
print('%s is piaoing' %name) if __name__ == '__main__':
p1=Process(target=piao,args=('alex',))
p2=Process(target=piao,args=('egon',))
p3 = Process(target=piao, args=('wupaiqi',))
p1.start()
p1.join()
p2.start()
p2.join()
p3.start()
p3.join()
# p1.join()
# p2.join()
# p3.join()
print ('主进程')
结果:
"D:\Program Files\Python36\python.exe" C:/Users/yangjianbo/PycharmProjects/untitled/第九课并发编程/进程的其他对象方法.py
alex is piaoing
egon is piaoing
wupaiqi is piaoing
主进程
结论:
如果是这么写的,就是真正的串行。
from multiprocessing import Process
import time,random
def piao (name):
print('%s is piaoing' %name) if __name__ == '__main__':
p1=Process(target=piao,args=('alex',))
p2=Process(target=piao,args=('egon',))
p3 = Process(target=piao, args=('wupaiqi',))
p_l=[p1,p2,p3]
for p in p_l:
p.start()
for p in p_l:
p.join()
print ('主进程')
进程之间的内存空间是隔离的
from multiprocessing import Process
n=100
def task():
global n
n=0
print (n)
if __name__ == '__main__':
p=Process(target=task)
p.start()
p.join()
print('主',n)
结果:
"D:\Program Files\Python36\python.exe" C:/Users/yangjianbo/PycharmProjects/untitled/第九课并发编程/进程之间的内存空间是隔离的.py
0
主 100
结论:
进程之间的内存空间是隔离的,因为我修改了子进程的n,但是主进程的n还是原来的。
查看进程的pid和ppid。
杀死进程
进程池
Python学习笔记九的更多相关文章
- python 学习笔记九 队列,异步IO
queue (队列) 队列是为线程安全使用的. 1.先入先出 import queue #测试定义类传入队列 class Foo(object): def __init__(self,n): self ...
- python学习笔记(九)、模块
1 模块 使用import 语句从外部导入模块信息,python提供了很大内置模块.当你导入模块时,你会发现其所在目录中,除源代码文件外,还新建了一个名为__pycache__的子目录(在较旧的Pyt ...
- python学习笔记九——序列
4.4 序列 序列是具有索引和切片能力的集合.元组.列表和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力,因此元组.列表和字符串都属于序列.序列索引功能演示: tuple=(&quo ...
- Python学习笔记九:装饰器,生成器,迭代器
装饰器 本质是函数,装饰其他函数,为其他函数添加附加功能 原则: 1不修改原函数的源代码 2不修改原函数的调用方式 知识储备: 1函数即变量 使用门牌号的例子说明函数,调用方式与变量一致 2高阶函数 ...
- Python学习笔记九-文件读写
1,读取文件: f=open('目录','读写模式',encoding='gbk,error='egiong') 后三项可以不写但是默认是' r'读模式:open函数打开的文件对象会自动加上read( ...
- Python学习笔记九:正则表达式
一:正则表达式的符号与方法 常用符号: .:匹配任何一个字符,换行符除外(所以,多行字符串中的匹配要特殊处理,见下面实例) *:匹配前一个字符0次或多次 +:匹配前一个字符1次或多次 ?:匹配前一个字 ...
- python学习笔记(九)函数返回多个值,列表生成式,循环多个变量,入参格式声明
一.函数返回多个值 1.函数如果返回多个值的话,它会把这几个值放到一个元组里面2.函数如果返回多个值的话,也可以用多个变量来接收 def say(): num1 = num2 = num3 = ret ...
- python学习笔记(九)-函数2
交换两个变量的值 a = 2 b = 1 b = 1 a = 2 #方式一: b,a = a,b #交换两个变量的值 print(a,b) #方式二: a = a + b #3 b = a - b # ...
- Python学习笔记(九)
Python学习笔记(九): 装饰器(函数) 内置函数 1. 装饰器 1. 作用域 2. 高阶函数 3. 闭包 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就 ...
随机推荐
- Grovvy带参数的闭包
定义带参数的闭包:
- 一、Mysql安装
一.官网下载:https://dev.mysql.com/downloads/mysql/ 二.解压下载好的压缩包,本人存放的位置如下: 如下图解压后的文件目录,因版本的差异.一开始解压后的文件夹下可 ...
- Go语言中的string知识点
1.Go语言String的本质就是一个[]byte,所以他们之间可以互相转换,byte数组的长度就是字符串的长度. func StringTest1() { str := "Hello,Wo ...
- MT【319】分段递推数列
已知数列$ x_n $满足$ 0<x_1<x_2<\pi $,且\begin{equation*} x_{n+1}= \left\{ \begin{aligned}x_n+\sin ...
- 【并发编程】【JDK源码】J.U.C--AQS 及其同步组件(2/2)
原文:慕课网高并发实战(七)- J.U.C之AQS 在[并发编程][JDK源码]AQS (AbstractQueuedSynchronizer)(1/2)中简要介绍了AQS的概念和基本原理,下面继续对 ...
- Loj #528. 「LibreOJ β Round #4」求和 (莫比乌斯反演)
题目链接:https://loj.ac/problem/528 题目:给定两个正整数N,M,你需要计算ΣΣu(gcd(i,j))^2 mod 998244353 ,其中i属于[1,N],j属于[1,M ...
- 深入理解JVM(5)——垃圾收集和内存分配策略
1.垃圾收集对象 垃圾收集主要是针对堆和方法区进行. 程序计数器.虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收. 哪 ...
- django系列4 :创建管理员
以下复制粘贴自官网 创建管理员用户¶ 首先,我们需要创建一个可以登录管理站点的用户.运行以下命令: / $ python manage.py createsuperuser 输入所需的用户名, ...
- Burnside引理的感性证明
\(Burnside\)引理的感性证明: 其中:\(G\)是置换集合,\(|G|\)是置换种数,\(T_i\)是第\(i\)类置换中的不动点数. \[L = \frac{1}{|G|} * \sum ...
- vue---mixins的用法
相信大家都用过less.sass等预编译器.它们中也有mixins,用法也很简单,例如Less中: .box{ border:1px solid red; padding:10px; } .mixin ...