zoukankan      html  css  js  c++  java
  • 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)
    •  

  • 相关阅读:
    维护
    zabbix监控线
    java——快排、冒泡、希尔、归并
    java——注解处理器
    spring boot——常用注解
    java——修改txt文件中某一行的内容
    spring boot——关于一个Mysql主键的问题
    mysql
    springboot
    自信点,不要怕
  • 原文地址:https://www.cnblogs.com/iaoyuyuyuhuanghuang/p/14308734.html
Copyright © 2011-2022 走看看