c语言编程笔录

首页 >   > 笔记大全

笔记大全

深入浅析python中的多进程

更新时间:2023-11-09

Python中的多进程

多进程指的是同时执行多个进程任务,每个进程都独立于其他进程运行。Python通过multiprocessing模块实现了多进程,在这个模块中提供了一个Process类,可以创建一个新的进程来执行指定的函数。下面我们将从以下几个方面深入浅析Python中的多进程:

1.使用方式

使用multiprocessing创建进程非常简单,只需要定义一个函数,然后将其传递给Process类的构造函数即可。下面是一个简单的例子:

    from multiprocessing import Process
    
    def func():
        print("子进程开始执行")
    
    if __name__ == '__main__':
        p = Process(target=func)
        p.start()
        print("主进程执行结束")
  

在这个例子中,我们定义了一个func函数,然后将其传递给Process类的构造函数。在主程序中,我们创建了一个进程对象p,并通过调用p.start()方法启动了这个进程。在子进程p中,它执行了func函数,打印出了一条消息。在主进程中,它继续执行了一条语句,打印出了"主进程执行结束"。

2.进程的参数和返回值

如果函数需要接收参数,我们可以将这些参数作为Process类的构造函数的参数进行传递。如果函数需要返回值,我们可以使用Queue(队列)数据结构实现进程之间的通信。下面是一个例子:

    from multiprocessing import Process, Queue
    
    def func(num, q):
        result = num * num
        q.put(result)
    
    if __name__ == '__main__':
        q = Queue()
        p = Process(target=func, args=(10, q))
        p.start()
        p.join()
        result = q.get()
        print(result)
  

在这个例子中,我们定义了一个func函数,它接收一个num参数,并计算num的平方并将结果存储到队列q中。在主程序中,我们创建了一个队列对象q,并将其与进程对象p关联起来。然后启动进程p,并在进程p执行结束后,获取并打印出队列q中存储的结果。

3.进程之间的通信

除了使用队列进行进程之间的通信,Python的multiprocessing模块还提供了一些其他的进程间通信方式,比如:Pipe(管道)、Value(共享单个值)。下面是一个使用Pipe进行进程间通信的例子:

    from multiprocessing import Process, Pipe
    
    def func(conn):
        conn.send('hello from child process')
        print('message from parent:', conn.recv())
        conn.close()
    
    if __name__ == '__main__':
        parent_conn, child_conn = Pipe()
        p = Process(target=func, args=(child_conn,))
        p.start()
        print('message from child:', parent_conn.recv())
        parent_conn.send('hello from parent process')
        p.join()
  

在这个例子中,我们创建了两个连接对象:parent_conn和child_conn,它们代表了一个双向通信的管道。然后我们定义了一个func函数,并将child_conn对象作为它的参数。在func函数中,我们首先通过child_conn.send()方法向父进程发送了一条消息,然后使用conn.recv()方法从父进程接收了一条消息。在主程序中,我们通过parent_conn.recv()方法从子进程中接收了一条消息,并使用parent_conn.send()方法向子进程发送了一条消息。

4.进程池

在实际应用中,我们可能需要同时启动多个进程来执行指定的函数。在这种情况下,使用进程池可以更好地管理和分配进程资源。在Python中,multiprocessing模块提供了Pool类来实现进程池的功能。下面是一个例子:

    from multiprocessing import Pool
    import random
    import time
    
    def func(num):
        print("process %d starts" % num)
        time.sleep(random.randint(1, 5))
        print("process %d ends" % num)
    
    if __name__ == '__main__':
        pool = Pool(processes=4)
        nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        pool.map(func, nums)
  

在这个例子中,我们定义了一个func函数,它接收一个num参数,并在函数中打印出"process num starts"和"process num ends"的消息。在主程序中,我们创建了一个进程池对象pool,并通过pool.map()方法将num列表传递给func函数。在这个例子中,我们指定了进程池的容量为4,表示最多同时会有4个进程在执行。

总结

Python的multiprocessing模块实现了多进程的功能,使用简单,可以通过Process类轻松地创建新的进程。同时,Python提供了Queue、Pipe、Value等多种进程间通信方式,方便进程之间的数据交换。当需要同时启动多个进程执行指定任务时,使用进程池可以更好地管理和分配资源。