• 并发多线程


    Process类

    使用multiprocess 一个多元化进程模块。(涵盖了和进程相关的多有内容)

    Process类帮助你启动和停止进程。(Process().start()  ; Process().terminate())

    使用Process类创建一个子进程
    import os
    import time
    from multiprocessing import Process
    def func(a,b,c):
        time.sleep(5)
        print(a,b,c,os.getpid(),os.getppid())
    
    if __name__ == '__main__':
        print('主:', os.getpid())
        Process(target=func,args=(1, 2, 3)).start()
        Process(target=func,args=(2, 3, 4)).start()
        Process(target=func,args=(3, 4, 5)).start()

    (注: __name__==__mian__ 中的代码为主代码(父进程),调用的func()为子进程,父进程中的os.getpid()==子进程中的os.getppid(), 子进程中的os.getpid为子进程的进程ID)

    (同时注意参数的加入方式)

    其他操作方法

    import os
    import time
    from multiprocessing import Process
    
    def func(a,b,c):
        time.sleep(3)
        print(a,b,c,os.getpid(),os.getppid())
    
    if __name__ == '__main__':
        print('主;',os.getpid())
        p = Process(target=func,args=(1,2,3))
        p.start()
        print(p.is_alive())
        p.terminate()
        print(p.is_alive())
        time.sleep(1)
        print(p.is_alive())
        p.name = 'douniwan'
        print(p.name)
        print(p.pid)
        print(p.__dict__)
    

    (注: p.is_alive()查看进程是否运行着,p.terminate()关闭进程,但不会立即关闭,方式为:并行非阻塞,会过一会关闭,进程关闭后可以继续查看和更改实例化进程的属性)

    开启多个子进程

    import os
    import time
    from multiprocessing import Process
    def func(a,b,c):
        time.sleep(3)
        print(a,b,c,os.getpid(),os.getppid())
    
    
    if __name__ == '__main__':
        Process(target=func,args=(1,2,3,)).start()
        Process(target=func,args=(2,3,4)).start()
        Process(target=func,args=(3,4,5,)).start()
        Process(target=func,args=(4,5,6,)).start()
        

    #两种方法
      for i in range(1,4): Process(target=func,args=(i, i+1, i+2)).start()

    join

    #join
    import time
    import random
    from multiprocessing import Process
    
    def send_mail(name):
        time.sleep(random.uniform(1,3))
        print('已经给%s发送邮件完毕'%name)
    
    if __name__ == '__main__':
        lst = ['alex','yuan','宝元','太白']
        阻塞等待一个子进程结束
        p = Process(target=send_mail, args=('alex',))
        p.start()
        p.join()   # 阻塞,直到p对应的进程结束之后才结束阻塞
        print('所有的信息都发送完毕了')
    
        p_l = []
        for name in lst:
            p = Process(target=send_mail,args=(name,))
            p.start()
            p_l.append(p)
        for p in p_l : p.join()
        print('所有的信息都发送完毕了')

    注意 join的使用 先把要阻塞的进程存放到列表里 然后分别与join结合。

    进程守护

    import time
    from multiprocessing import Process
    
    def func():
        for i in range(20):
            time.sleep(0.5)
            print('in func')
    
    def func2():
        print('star : func2')
        time.sleep(5)
        print('end : func2')
    
    if __name__ == '__main__':
        p = Process(target=func)
        p.daemon = True
        p.start()
        p2 = Process(target=func2)
        p2.start()
        print('in main')
        time.sleep(3)
        print('finished')
        p2.join

    进程守护 p.daemon=True  守护主程序代码完成就结束     p2.join 为p2阻塞   在怕p2完成之前主程序代码没有结束。如果不加p2.join 主程序代码完成后就结束 会导致p2没有完成   。(p1始终没有运行完)

  • 相关阅读:
    webservice 测试窗体只能用于来自本地计算机的请求
    未能加载文件或程序集system.web.extensions解决方法
    VS2010中水晶报表应用及实例
    存储过程
    Windows下wamp的配置问题(php初学者必看!!)
    IIS附加进程在Visual Studio 2010 中进行调试(高级)
    求职之(1)各公司待遇~~可能有点老了
    编译原理之(2)C++词法文件,语法文件
    STL笔记(4)关于erase,remove
    STL笔记(6)标准库:标准库中的排序算法
  • 原文地址:https://www.cnblogs.com/qj696/p/10711356.html
Copyright © 2020-2023  润新知