Python多进程

作者: Recalcitrant | 来源:发表于2019-07-06 17:01 被阅读0次

    目录:
    一、进程的状态
    二、进程的创建
    三、进程间通信
    四、进程池

    Python并发之多进程

    一、进程的状态

    工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态:


    • 就绪态:运行的条件都已经满足,正在等在cpu执行。
    • 执行态:cpu正在执行该进程。
    • 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态。

    二、进程的创建

    import multiprocessing
    import time
    import os
    
    
    def run(name):
        time.sleep(2)
        print("进程{}启动...".format(name))
        print("进程{} ID:{}".format(name, os.getpid()))
        print("进程父ID:{}".format(os.getppid()))
    
    
    if __name__ == '__main__':
        p1 = multiprocessing.Process(target=run, args=("p1",))
        p2 = multiprocessing.Process(target=run, args=("p2",))
        p1.start()
        p2.start()
        p1.join()      # 等待进程p1执行完毕
        p2.join()      # 等待进程p2执行完毕
        print("All processes finished...")
        print("主进程ID:{}".format(os.getpid()))
    
    运行结果

    三、进程间通信

    1.Queue队列

    示例:

    from multiprocessing import Process, Queue
    q = Queue(10)
    
    
    def producer(q):
        print(id(q))
        for i in range(100000):
            q.put(i)
    
    
    def consumer(q):
        print(id(q))
        for i in range(100000):
            data = q.get()
            print(data)
    
    
    if __name__ == "__main__":
        p = Process(target=producer, args=(q,))
        c = Process(target=consumer, args=(q,))
        p.start()
        c.start()
    

    四、进程池

    示例:

    from concurrent.futures import ProcessPoolExecutor
    import os
    import time
    
    
    def task(n):
        print('进程ID:%s is running...' % os.getpid())
        time.sleep(2)
        return n**2
    
    
    if __name__ == '__main__':
        p = ProcessPoolExecutor()         # 不填则默认为CPU的个数
        l = []
        t0 = time.time()
        for i in range(20):
            obj = p.submit(task, i)       # submit()方法返回的是一个future实例,要得到结果需要用obj.result()
            l.append(obj)
    
        p.shutdown()        # 类似用from multiprocessing import Pool实现进程池中的close及join一起的作用
    
        print([obj.result() for obj in l])
        ts = time.time()
        print("耗时:", ts - t0)
    
    运行结果

    相关文章

      网友评论

        本文标题:Python多进程

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