网络编程
网络编程
1.进程概念
1.1什么是程序
程序是永久的,做事的过程,没有生命周期 死的,永久存放在那
1.2什么是进程 process
进程是是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程是线程的容器,进程里面可以开线程,进程可以说是一个过程,是动态的,他不是干活的,真正干活的是线程,进程是一个实体,每一个进程都有自己的地址空间
调用一次程序,就会出现一个进程
进程是动态的,有生命周期
例子:菜谱是程序 死的,做菜的过程就是进程, 厨师是线程,是干活的,
#进程调度算法三种
1.2.1先来服务调度算法;谁先来执行谁,谁下来服务谁
1.2.2短作业优先调度算法;干那一件事需要时间少,先干那个
1.2.3时间片轮转法;有时间限制,几点必须干什么
1.3线程
进程里面的是线程,一个进程可以包括多个线程,具体干活的人
#进程和线程都是由操作系统来调度,浏览器新开一个窗口叫做新开一个进程,具体怎么做要看线程
1.4协程
解决单线程下的高并发
2.进程的并行和并发
并行:在一个精确地时间片刻,比如在十点零1分5毫秒同时执行听歌,看视频(多核cpu)系统具同时处理多个任务的能力。
并发:在某一个时间段看似同时执行,听歌,看视频同时运行 来回切换(单核cpu),#自己理解:高并发:单核cpu状态下同一时刻很多用户访问,来回切换用户,精确到毫秒
1.i/o消耗(i/o密集型)
input:输入
output:输出
不需要用到cpu
2.计算密集型:cpu只用来计算 ,其他什么也不敢
需要占用cpu
进程的三种状态
1.就绪:准备打针
2.运行:正在打针
3.阻塞:皮太厚了 没打透
3.同步异步阻塞,非阻塞
#同步和异步概念
3.1同步:一个任务的完成需要依赖另一个任务,比如老师要喝水,张三去接水,没这杯水,老师上不了课
3.2异步:一个任务的完成不需要依赖另一个任务 比如老师要喝水,张三去接水,然后老师继续上课,不管他
#阻塞和非阻塞主要是程序(线程)等待消息通知时候的状态,等张三接水时候老师的状态
3.3阻塞:张三去接水了,我是继续等(阻塞)卡在这,啥也不干,必须等你水回来,老师的状态
3.4非阻塞:他去接他的水,不管他继续讲课(非阻塞)老师的状态
#同步和异步关注的是消息通信机制
#阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
同步阻塞:效率最低,张三去倒水,别人什么都不能干 只能等
异步阻塞: 张三去倒水,老师等着
同步非阻塞:张三去倒水,老师时不时催一下,来回切换
异步非阻塞:效率最高 张三去倒水,老师上课 ,等他接回来水,给老师,老师喝水
#例子知乎的
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1老张把水壶放到火上,立等水开。(同步阻塞)老张觉得自己有点傻
2老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阳塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3老张把响水壶放到火上,立等水开。(异步阻塞)老张觉得这样傻等意义不大
4老张把响水壶放到火上,去客厅看电视水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)老张觉得自己聪明了
所谓同步异步,只是对于水壶而言。普通水壶,同步:响水壶,异步,虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。
同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。所谓阻塞非阻塞,仅仅对于老张而言,立等的老张,阻塞:看电视的老张非阳塞情况1和情况3中老张就是阻塞的,媳妇喊他都不知道
虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。
4.开启进程
from multiprocessing import Process
#写一个方法
def write():
with open('a.txt', 'w') as f:
f.write('helloaaaaswsdawd')
# group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None
#windows必须写在main方法里面
if __name__ == '__main__':
#实例化Process 给一个形参target=上面的方法,
p = Process(target=write)
#对象调用start()
p.start()
5.Process类的参数
from multiprocessing import Process
#写一个方法
def write(name,age):
print(name)
print(age)
# group=None, 目前忽略
# target=None, 指定方法
# name=None, 进程名字 name='拖沓李天王'
# args=(), 参数args=('zhang',18) 位置参数
# kwargs={}, kwargs={'age':200,'name':'zhang'} 根据名字传
# *,daemon=None
#windows必须写在main方法里面
if __name__ == '__main__':
#实例化Process 给一个形参target=上面的方法,
p = Process(target=write,name='拖沓李天王',kwargs={'age':200,'name':'zhang'})
#对象调用start()
p.start()
print(p.name)
6.Process类的方法
from multiprocessing import Process
import time
#写一个方法
def write(name,age):
print(name)
# print(age)
#windows必须写在main方法里面
if __name__ == '__main__':
#实例化Process 给一个形参target=上面的方法,
p = Process(target=write,kwargs={'age':200,'name':'zhang'})
#对象调用start()
p.start() #启动进程,通知操作系统开进程
# print(p.is_alive())
#p.run() #进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
# p.terminate()#强制终止进程
# time.sleep(1)#杀死进程需要一段时间
# print(p.is_alive()) #判断进程是否存活
#p.join()
#子进程:process实例化的对象
#主进程:运行的py文件
#父进程:pycharm 在哪运行的py文件 那个就是父进程
p.join()#等待子进程结束
print('end------')
7.Process类的属性 获取进程号
from multiprocessing import Process
import time
import os
def task (age,name):
#获取当前进程id号
print('子进程的id号:%s'%os.getpid())
print('父进程的id号:%s'%os.getppid())
time.sleep(15)
#windows必须写在main方法里面
if __name__ == '__main__':
#实例化Process 给一个形参target=上面的方法,
p = Process(target=task,kwargs={'age':200,'name':'aaa'})
#对象调用start()
#守护进程 p的父进程执行完毕,p立即结束 一定要放在start之前
# p.daemon=True
p.start() #启动进程,通知操作系统开进程
# print('end')
#获取当前子进程id号
print(p.pid)
print('main里的主进程的id号:%s'%os.getpid())
print('main里的父进程的id号:%s'%os.getppid())
8.多进程
from multiprocessing import Process
import time
import os
def task (i):
time.sleep(3)
print(i)
if __name__ == '__main__':
ll=[]
for i in range(10):
p = Process(target=task,args=(i,))
p.start()
#每次都把p添加给ll列表
ll.append(p)
for j in ll:
j.join()