zoukankan      html  css  js  c++  java
  • 并发编程的理论 python中实现多进程

    1并发编程就是让你的程序可以同时处理多个任务

    2.并发编程的基石是 多道技术

      空间复用:同一个时间 内存存储了多个程序

      时间复用:当一个程序遇到了io操作,或者长时间占用cpu后切换到其他程序上,来提高cpu利用率

      多道技术的缺点:当应用程序都是计算任务时候切换反而会降低效率(但是必须切换才能保证多任务并发)

    3 并发 与 并行

    并发 多个事件同时发生,也称为伪并行

    并行多个事件同时进行

    阻塞和非阻塞 指的是程序的状态:

      1.就绪  2.运行 3.阻塞

    4两种使用进程的方式

      1.直接创建Process对象 指定target参数

    from multiprocessing import Process
    import os
    
    
    #
    def task(name):
        print(name)
        print("self",os.getpid())
        print("parent", os.getppid())
        print("task run")
    
    #  windows创建子进程时  子进程会将父进程的代码加载一遍  导致重复创建子进程
    #  所以一定要将 创建子进程的代码放到main的下面
    if __name__ == '__main__':
        print("self", os.getpid())
        print("parent", os.getppid())
        p = Process(target=task, name="这是子进程!",kwargs={"name":"bgon"})  # 创建一个表示进程的对象  但并不是真正的创建进程
        p.start()  # 给操作系统发送通知 要求操作系统开启进程

      2继承Process 覆盖run 方法 

    创建进程的第二种方式  继承Process  覆盖run方法
    # 在子进程启动以后会自动执行run方法
    # 其优势是 可以自定义 进程的属性和行为 来完成一些额外任务 例如下载
    # class MyProcess(Process):
    #
    #     def __init__(self,url):
    #         self.url = url
    #         super().__init__()
    #
    #     # 子类中的方法  只有run会被自动执行
    #     def run(self):
    #         print("下载文件...." , self.url)
    #         print(" run run run!")
    #
    #     def task(self):
    #         pass
    #
    # def task():
    #     print(123)
    
    # if __name__ == '__main__':
    #     p = MyProcess("www.baidu.com/xx.mp4")
    #     p.start()

    5 每个进程之间的数据都是独立的.子进程再被创建的时候会拷贝一份父进程的数据, 而子进程中的数据修改,不影响父进程

    6 p.join() 用来使子进程对象再被cpu调用时提高优先级 优先调用执行完子进程后 再去执行 父进程中的接下去的代码程序

    import time
    from multiprocessing import Process
    
    def task():
        print("上传文件....")
        time.sleep(3)
        print("上传结束...")
    
    
    # [进程1,进程2,进程3]
    
    if __name__ == '__main__':
        p = Process(target=task)
        p.start()
    
        p.join() # 本质上  是提高了子进程优先级   当CPU在切换时 会优先切子进程
    
        print("上传文件成功!")
    
    def task(num):
        print("我是%s号 进程" % num)
        time.sleep(2)
        print("=========")
    
    if __name__ == '__main__':
        start_time = time.time()
        ps = []
        for i in range(3):
            p = Process(target=task,args=(i,))
            p.start()
            ps.append(p)
    
        for p in ps:
            p.join()
    
        print(time.time()-start_time)
        print("over")

    7.process 的常用属性:

    p.is_alive()  # 布尔值 判断进行是否是存活运行的

    p.terminate()  终止这个进程

    p.daemon  守护进程 

    8 孤儿进程和僵尸进程

    孤儿进程 指的是 父进程已经被终止了 但自己还在运行 是无害的 后续由操作系统接手进行回收

    僵尸进程 是指子进程执行完成所有任务后 已经终止了但是残留了一些信息 (进程id名字 等资源) 但是父进程没有去处理这些残留 ,僵尸进程是有害的,当出现大量的僵尸进程时 会占用系统资源 可以把它父进程杀掉 僵尸就成了孤儿 操作系统会负责回收数据

    import  time
    from multiprocessing import Process
    def task1():
    print("子进程 run")

    if __name__ == '__main__':
    for i in range(10):
    p = Process(target=task1)
    p.start()

    time.sleep(100000) 父进程睡眠产生僵尸进程
  • 相关阅读:
    Grails批改默认启动端口
    基于注解的SpringMVC简单介绍
    JSP、Servlet中的相对路径和绝对路径
    jsp相对路径绝对路径
    idea如何设置注释作者信息
    alt+4 打开控制台
    idea常用快捷键
    解决Error running 'index.jsp : Address localhost:1099 is already in use的方法
    演示事物所需表
    关于jdbc的面试题
  • 原文地址:https://www.cnblogs.com/fanbiyong/p/10190610.html
Copyright © 2011-2022 走看看