文库网站开发教程,wordpress媒体库文件夹,重庆开发app的公司,去哪里找做网站的人今日内容概要 进程基础(操作系统中的概念) 进程调度算法(四种算法) 进程的并行和并发的概念 同步异步阻塞非阻塞的概念 创建进程(进程类Process) Process类的参数 Process类的方法 如何开启多进程 基于TCP协议的高并发程序
进程基础
进程它是操作系统中最重要的概念…今日内容概要 进程基础(操作系统中的概念) 进程调度算法(四种算法) 进程的并行和并发的概念 同步异步阻塞非阻塞的概念 创建进程(进程类Process) Process类的参数 Process类的方法 如何开启多进程 基于TCP协议的高并发程序
进程基础
进程它是操作系统中最重要的概念也是最基本的一个概念 线程也是操作系统中的一个很重要的概念
进程和线程都是有操作系统来调度使用的我们程序员是不能控制的这里就设计到调度算法
什么是进程什么是线程什么是程序 进程和程序是两码事、完全不一样 程序其实是一个死的东西、一堆代码就是程序他也没有生命周期 进程它是有生命周期的这个任务做完进程就不存在了
在一个进程中可以有多个线程一个进程中只有一个线程也是可以的。 一个进程中至少要有一个线程 进程和线程他们都是有操作系统来调度的程序员级别是没办法来调度的协程就是程序员级别的协程的调度它就是有我们程序员自己来调度的在操作系统中是没有协程这个概念的是我们人为的抽象出来的
进程》》》线程》》》协程 消耗资源对比进程》》》线程》》》协程
单个cpu一次只能运行一个任务
进程调度算法
cpu的工作机制 1.遇到I/O的时候cpu会交出执行权限 2.当cpu遇到耗时比较长的时候也会自动交出执行权限切换到其他任务
I/O密集型 他会被时间所阻塞不会占用大量的cpu资源比如sleep(3) 计算机密集型 不占用大量的时候 会占用大量的cpu资源这种情况就是计算机密集型没有时间的大量消耗
for i in range(10000000):i1
一、先来先服务调度算法 二、短作业优先调度算法 三、时间片轮转法 四、多级反馈队列
进程的并行和并发概念
并行统一时刻同时运行 如果cpu是单核的同一时刻能不能做到同时执行多个任务不能 如果是多核就可以同一时刻做到 核是2最多同一时刻最多执行2个任务 核是4同一时刻最多执行4个任务
并发一段时间内看起来是同时运行 如果是单核的cpu听课、看视频、浏览网页能不能一起操作是可以的cpu的切换达到的
同步 异步 阻塞和非阻塞
所谓同步就是在发出一个*调用*时在没有得到结果之前该*调用*就不返回。但是一旦调用返回就得到返回值了。 换句话说就是由*调用者*主动等待这个*调用*的结果。
而异步则是相反*调用*在发出之后这个调用就直接返回了所以没有返回结果。换句话说当一个异步过程调用发出后调用者不会立刻得到结果。而是在*调用*发出后*被调用者*通过状态、通知来通知调用者或通过回调函数处理这个调用。
典型的异步编程模型比如Node.js
阻塞和非阻塞关注的是程序在等待调用结果消息返回值时的状态.
阻塞调用是指调用结果返回之前当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前该调用不会阻塞当前线程
如何创建进程
from multiprocessing import Process
def task():with open(a.txt,w,encodingutf-8) as f:f.write(helloworld)if __name__ __main__: # windows平台上必须写在这个里面p Process(targettask) # 实例出来一个进程类让这个进程执行task任务p.start() # 真正的开始进程process类参数
from multiprocessing import Processdef task(name, age, gender):print(name, age, gender)with open(a.txt, w, encodingutf-8) as f:f.write(helloworld)现在这个写法还没有开启进程
Windows平台上必须写在这个里面
if __name__ __main__:groupNone, targetNone, nameNone, args(), kwargs{},*, daemonNonep Process(targettask, nameprocess-2, args(), kwargs{name:jerry, age:20, gender:male}) # 实例出来一个进程类 让这个进程执行task任务p.start() # 真正的开启进程# 操作系统是负责把这个进程开起来# 开启一个进程来执行task任务真正是谁在执行这个任务是线程进程里面至少要有一个线程进程的几个属性1. 进程名 2. 进程号pid kill # 如何查看进程的名称print(p.name) # Process-1# 怎么改进程名字# p.name 这是新的进程名# print(p.name) # 这是新的进程名 Process类的几个方法
from multiprocessing import Processimport time
def task(name, age, gender):print(name, age, gender)# with open(a.txt, w, encodingutf-8) as f:# f.write(helloworld)time.sleep(3)print(子进程的代码)现在这个写法还没有开启进程
Windows平台上必须写在这个里面
if __name__ __main__:groupNone, targetNone, nameNone, args(), kwargs{},*, daemonNone# 子进程 主进程只是通知操作系统去开进程并不是立马把进程开起来他是需要消耗一定的时间的侧面的反应了开启进程其实消耗很大p Process(targettask, nameprocess-2, args(), kwargs{name:jerry, age:20, gender:male}) # 实例出来一个进程类 让这个进程执行task任务p.start() # 真正的开启进程# 操作系统是负责把这个进程开起来# 开启一个进程来执行task任务真正是谁在执行这个任务是线程进程里面至少要有一个线程进程的几个属性1. 进程名 2. 进程号pid kill # 如何查看进程的名称# print(p.name) # Process-1# 怎么改进程名字# p.name 这是新的进程名# print(p.name) # 这是新的进程名## 如何查看进程号# print(p.pid) # process id# print(p.is_alive()) # True# p.terminate() # 杀死进程结束任务# import time# time.sleep(1)# print(p.is_alive())p.join() # 等待子进程的代码全部执行完毕在走主进程的print(主进程的代码执行完毕)
如何开启多进程
多进程就意味着可以同时做多个任务嘛 一个进程做一个任务多个进程肯定是做多个任务
from multiprocessing import Processimport time
def task(name):# print(name)# with open(a.txt, a, encodingutf-8) as f:# f.write(helloworld)print(子进程)time.sleep(1)
if __name__ __main__:理论上你是可以一直开进程单是你需要考虑资源的消耗情况start_time time.time()ll []for i in range(10):pProcess(targettask, kwargs{name:kevin})p.start()# p.join() #ll.append(p)for j in ll:j.join()print(主进程, 总时间, time.time() - start_time)
基于TCP协议的高并发程序
一个服务端不能够同时给多个客户端发送消息
import socket # python提供的socket模块def task(conn):while True:try:# 异常了一个bug粘包现象data conn.recv(1024) # 括号里面写的是接收的字节数最多接收1024个字节if len(data) 0:continueprint(data) # 还是bytes类型# 服务端开始给客户端也发送一个数据conn.send(data.upper())except Exception as e:print(e)breakconn.close()from multiprocessing import Processif __name__ __main__:# 1. 买手机# SOCK_STREAM 代表的是TCP协议# socket.socket(socket.AF_INET, socket.SOCK_STREAM)# socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # udp协议server socket.socket() # 默认是TCP协议# 2. 买手机卡# 0.0.0.0 代表允许任何的ip链接# server.bind((0.0.0.0, 8000)) # 服务端绑定一个地址server.bind((127.0.0.1, 8001)) # 服务端绑定一个地址# 3. 开机server.listen(1) # 监听半连接池print(服务端正在准备接收客户端消息)while True:conn, client_addr server.accept() # 接收, 程序启动之后会在accept这里夯住阻塞p Process(targettask, args(conn,))p.start()