网络编程

网络编程

1.进程概念

1.1什么是程序
	程序是永久的,做事的过程,没有生命周期 死的,永久存放在那 
1.2什么是进程 process
进程是是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程是线程的容器,进程里面可以开线程,进程可以说是一个过程,是动态的,他不是干活的,真正干活的是线程,进程是一个实体,每一个进程都有自己的地址空间
调用一次程序,就会出现一个进程
	进程是动态的,有生命周期
例子:菜谱是程序  死的,做菜的过程就是进程, 厨师是线程,是干活的,
#进程调度算法三种
	1.2.1先来服务调度算法;谁先来执行谁,谁下来服务谁
    1.2.2短作业优先调度算法;干那一件事需要时间少,先干那个
    1.2.3时间片轮转法;有时间限制,几点必须干什么
1.3线程
	进程里面的是线程,一个进程可以包括多个线程,具体干活的人 
#进程和线程都是由操作系统来调度,浏览器新开一个窗口叫做新开一个进程,具体怎么做要看线程
1.4协程
	解决单线程下的高并发

2.进程的并行和并发

并行:在一个精确地时间片刻,比如在十点零15毫秒同时执行听歌,看视频(多核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()
posted @ 2021-08-31 22:02  迪迦张  阅读(21)  评论(0编辑  收藏  举报