学习Python的第29天

1.基础进程

1.1定义

进程和程序是不同的

程序:是一个死的东西一堆代码就是程序他是没有生命周期。

进程:他是有生命周期的,你把这个任务做完就是它生命周期结束的时候。

在一个进程中可以是单线进程,也是以是多线进程。但是一个进程必须要有一个线程。进程和线程都是由操作系统调度的,程序员是没有办法来调度的,协程就是程序员级别的,协程的调度是由我们程序自己来调度的,且单个cpu一次只能执行一个任务。

1.2消耗资源对比

进程>线程>协程

2.进程的调度算法

2.1cpu的工作机制

1.遇到I/O时cpu会交出执行权限。

2.当cpu遇到耗时较长的时候,也会自动交出执行权限,切换到其它任务。

I/O密集型

他会被时间所阻塞,不会占用大量的cpu资源,比如sleep(3)。

计算密集型

不占用大量时间,但是会占用大量的cpu资源。 

2.2四种调度算法

1.先来先服务调度算法

2.短时间优先调度算法

3.时间片轮转算法

4.多级反馈队列

3.进程的并行和并发概念

1.并行:

统一时刻同时运行

如果cpu是单核的,同一时刻不能做到同时执行多个任务。

如果cpu是多核的,同一时刻就能做到了。

如果核是2,那么同时最多执行2个进程。

2.并发:

一段时间内看起来是同时运行的

例如单核cpu同时听歌聊vx和看网页单核cpu也是可以运行的

4.同步阻塞异步阻塞和非阻塞

同步:每一次的运行都要依赖上一步的结果。

异步:每次运行的结果不依赖上一次的结果。

异步的频率更高,同步的就更低

异步加非阻塞是效率最高的

同步加阻塞是效率最低的

5.如何创建进程

from multiprocessing import Process


def task():
    with open('a.txt', 'w', encoding='utf-8') as f:
        f.write('helloworld')


"""现在这个写法还没有开启进程"""
"""Windows平台上必须写在这个里面"""
if __name__ == '__main__':
    p = Process(target=task)  # 实例出来一个进程类, 让这个进程执行task任务
    p.start()  # 真正的开启进程
   

6.Process类的参数

6.1process

from multiprocessing import Process

import time
def task(name, age, gender):
    print(name, age, gender)
    # with open('a.txt', 'w', encoding='utf-8') as f:
    #     f.write('helloworld')
    time.sleep(3)
    print("子进程的代码")

"""现在这个写法还没有开启进程"""
"""Windows平台上必须写在这个里面"""
if __name__ == '__main__':
    """
    group=None, target=None, name=None, args=(), kwargs={},
                 *, daemon=None
    """
    # 子进程  主进程
    """只是通知操作系统去开进程,并不是立马把进程开起来,他是需要消耗一定的时间的,侧面的反应了开启进程其实消耗很大"""
    p = Process(target=task, name='process-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("主进程的代码执行完毕")

7.如何开启多进程 

多进程就意味着可以同时做多个任务嘛, 一个进程做一个任务,多个进程肯定是做多个任务
from multiprocessing import Process

import time
def task(name):
    # print(name)
    # with open('a.txt', 'a', encoding='utf-8') as f:
    #     f.write('helloworld')
    print("子进程")
    time.sleep(1)
if __name__ == '__main__':
    """理论上你是可以一直开进程,单是你需要考虑资源的消耗情况"""
    start_time = time.time()
    ll = []
    for i in range(10):
        p=Process(target=task, kwargs={'name':'kevin'})
        p.start()
        # p.join() #
        ll.append(p)

    for j in ll:
        j.join()

    print("主进程, 总时间:", time.time() - start_time)

8.基于TCP协议的高并发程序

一个服务端不能够同时给多个客户端发送消息
import socket  # python提供的socket模块

def task(conn):
    while True:
        try:
            # 异常了一个bug,粘包现象
            data = conn.recv(1024)  # 括号里面写的是接收的字节数,最多接收1024个字节
            if len(data) == 0:
                continue
            print(data)  # 还是bytes类型

            # 服务端开始给客户端也发送一个数据
            conn.send(data.upper())
        except Exception as e:
            print(e)
            break

    conn.close()


from multiprocessing import Process

if __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(target=task, args=(conn,))
        p.start()

 

.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值