多进程

作者: Freedom_pxc | 来源:发表于2018-04-12 01:38 被阅读0次
    多进程简单理解:

    进程之间是独立的,是操作系统自己来维护和管理的,python通过C接口起了一个进程,多进程可以充分的利用多核CPU

    • 多进程的创建:
    """
    multiprocessing模块式python为开发多进程提供跨平台的模块模块式python为开发多进程提供跨平台的模块
    """
    from multiprocessing import Process
    #参数可有可无
    def run(path,name):
        #while True:
        for i in range(100):
            print("唱歌去",path,name)
    
    if __name__ == "__main__":
        print("程序开始运行....")
        #target属性 指向执行的函数(传递),不是调用返回值
        #创建独立的进程对象(可以开辟多个对象)
        task1 = Process(target=run,args=("ktv","唱吧"))
        #启动进程
        task1.start()
        task2 = Process(target=run,args=("去酒吧","sssss"))
        task2.start()
        print("程序运行结束")
    
    多进程间的通信:

    进程间独立,如果想相互访问,就必须有一个中间翻译,下面提供了几种进程间通信的方法

    • 进程Queue
    #import queue
    from multiprocessing import Process,Queue
    
    #子进程,内存独立,相当于数据的传递
    def x(subQueue):
        subQueue.put("呵呵")
    
    if __name__ == "__main__":
        #进程Queue
        q = Queue()
        #创建进程
        p = Process(target=f,args=(q,))
        #执行进程
        p.start()
        print(q.get())
    """
    Queue通信,相当于父进程赋值了一个Queue给子进程,
    子进程在这个Queue放好数据后,序列化一个中间翻译,
    然后在反序列化返回给父进程,
    因为进程之间内存独立,不能传递对象,传递的其实是序列化的数据
    """
    
    • Pipe:
      多进程有一种传递方式叫管道,它的原理和Queue相同
    from multiprocessing import Process,Pipe
    
    #定义子进程执行
    def x(Subconn):
        Subconn.send("成绩出来了吗")
        print("这个是父亲的询问:",Subconn.recv())
        Subconn.close()
    
    if __name__ == "__main__":
    #创建管道两端
        parent_conn,child_conn = Pipe()
    #创建子进程
        p = Process(target = x.argst =(child_conn,))
        p.start()     #控制流程
        print("l来自儿子的问候:",parent_conn.recv())
        parent_conn.send("出来了,不怎么好")
        p.join()
    
    进程锁:

    虽然内存独立,但是即使是打印也会造成打印数据错误,为了防止进程间抢屏幕打印输出,加了进程锁

    from multiprocessing import Process,Lock
    
    #定义子进程执行
    def x (lock,num)
        lock.acquire()
        print("哈哈,嘻嘻,嘿嘿",num)
        lock.release
    
    if __name__ == "__main__":
        lock = Lock()
    #循环创建50个子进程
        for num in range(50):
            Process(target = x, args=(lock,num)).start()
    
    进程池:

    当我们需要的进程数量不多的时候,我们可以使用multiprocessing的Process类来创建进程。但是如果我们需要的进程特别多的时候,手动创建工作量太大了,所以Python也为我们提供了Pool(池)的方式来创建大量进程。

    from multiprocessing import Pool
    import os,time
    
    def run(msg):
        print("开始一个子线程运行了……")
        time.sleep(1)
        print("开始一个子线程运行结束了……")
    
    if __name__ == "__main__":
        pool = Pool(3)  # 表示初始化一个进程池,最大进程数为3
        for x in range(10):
            pool.apply_async(run, args=("hello pool",))
        print("------start----")
        pool.close() # 关闭池
        pool.join() # 等待所有的子进程完成,必须放在close后面
        print("-------end------")
    

    相关文章

      网友评论

          本文标题:多进程

          本文链接:https://www.haomeiwen.com/subject/kketkftx.html