python网络编程 day32 网络编程——进程multiprocessing模块及join用法

一、内容回顾

操作系统的历史 多道操作系统 遇到IO操作就切换的 提高CPU的利用率 进程之间数据隔离 时空复用 : 再同一个时间点上,多个程序同时执行着,一块儿内存条上存储了多个进程的数据 分时操纵系统 时间分片 时间片轮转 进程 是计算机中最小的资源分配单位 : 每一个程序在运行起来的时候需要给分配一些内存 一个运行的程序 在操作系统中用pid来唯一标识一个进程 线程 是计算机中能被CPU调度的最小单位 : 实际执行具体编译解释之后的代码的是线程,所以cpu执行的是解释之后的线程中的代码 并行和并发 并发 : 一个CPU,多个程序轮流执行 并行(好):多个cpu,各自在自己的cpu上执行多个程序 同步和异步 同步 : 调用一个操作,要等待结果 异步 : 调用一个操作,不等待结果 阻塞和非阻塞 阻塞 : CPU不工作 非阻塞 : CPU工作 同步阻塞 input sleep recv recvfrom 同步非阻塞 ret = eval('1+2+3+4+5') def func(*args): count = 0 for i in args: count += i return count a = 1 b = 2 c = a + b d = func(a,b,c) print(d)

异步非阻塞(阻塞 blocking) 异步阻塞

 

import socket sk =socket.socket() sk.setblocking(False) sk.bind(('127.0.0.1',9001)) sk.listen()

while True: try: conn,addr = sk.accept() except BlockingIOError: pass

 

二、今日内容

1、进程的三状态图

  • 就绪

  • 运行

  • 阻塞

2、进程的调度算法

  • 给所有的进程分配资源或者分配CPU使用权的一种方法

  • 短作业优先

  • 先来先服务

  • 多级反馈算法

    • 多个任务队列,优先级从高到低

    • 新来的任务总是优先级最高的

    • 每一个新任务几乎会立即获得一个时间片时间

    • 执行完一个时间片之后就会降到下一级队列中

    • 总是优先级高的任务都执行完才执行优先级低的队列

    • 并且优先级越高时间片越短

3、进程的开启和关闭

 

 

4、进程模块

  • os.getpid() 获取进程ID

  • os.getppid() 获取父进程ID

  • 进程的开启

    from multiprocessing import Process
    import os
    def func():
       print(os.getpid(),os.getppid())

    if __name__ == '__main__':
       print('main:',os.getpid(),os.getppid())
       p = Process(target=func)
       p.start()

     

  • multiprocessing模块内的Process类

    from multiprocessing import Process

    def func(name,age):
       print(f'{name}今天多少{age}岁了')
       print('发送完成')

    if __name__ == '__main__':
       lst = [('alex',84),('wusir',78),('taibai',69)]
       p_lst = []
       for i in lst:
           p = Process(target=func,args=i)
           p.start()
           p_lst.append(p)
       for p in p_lst:
           p.join()
       print('全部统计完成')

     

  • join的用法

    from multiprocessing import Process

    def func(name,age):
       print(f'{name}今天多少{age}岁了')
       print('发送完成')

    if __name__ == '__main__':
       lst = [('alex',84),('wusir',78),('taibai',69)]
       p_lst = []
       for i in lst:
           p = Process(target=func,args=i)
           p.start()
           p_lst.append(p)
       for p in p_lst:
           p.join()
       print('全部统计完成')
  • 使用多进程实现并发socket的server端

    from multiprocessing import Process
    import socket


    def talk(conn):
       while True:
           msg = conn.recv(1024).decode('utf-8')
           msg = msg.upper()
           conn.send(msg.encode('utf-8'))

    if __name__ == '__main__':
       sk = socket.socket()
       sk.bind(('127.0.0.1', 9001))
       sk.listen()
       while True:
           conn, _ = sk.accept()
           p = Process(target=talk,args= (conn,))
           p.start()
    import socket
    sk = socket.socket()
    sk.connect(('127.0.0.1',9001))
    while True:
       sk.send('hello'.encode('utf-8'))
       msg = sk.recv(1024).decode('utf-8')
       print(msg)
  •  

原文地址:https://www.cnblogs.com/iaoyuyuyuhuanghuang/p/14308734.html