📜  Python 多进程处理(1)

📅  最后修改于: 2023-12-03 15:19:08.558000             🧑  作者: Mango

Python 多进程处理

Python 是一种解释型的语言,具有易上手、开发效率高等优点。但由于解释型的特点,Python 也会存在执行效率较低、计算速度慢等缺点。为了解决这些问题,Python 2.4 引入了 multiprocessing 模块,允许开发者使用多个进程来并行处理任务,从而提高程序的执行效率。

什么是进程?

进程是计算机中正在运行的一个程序。这个程序可以是用户自己写的,也可以是系统自带的。每个进程都有自己的运行空间,包括独立的内存空间、寄存器组和打开的文件等。进程之间互相独立,不会互相影响。

Python 中的多进程处理

在 Python 中,我们可以使用 multiprocessing 模块来创建多个进程。这里我们以 Process 类为例:

from multiprocessing import Process

def func(name):
    print(f"Hello, {name}!")

if __name__ == '__main__':
    p = Process(target=func, args=('Alice',))
    p.start()
    p.join()

这个例子中,我们先定义了一个 func 函数。然后使用 Process 类创建了一个进程 p,并将 func 函数作为进程的执行函数,并将参数 (Alice,) 传递给函数。最后使用 start 函数来启动进程,使用 join 函数来等待进程执行完毕。

进程间通信

不同进程之间的内存空间是相互独立的,因此它们不能直接共享数据。但是,Python 提供了多种进程通信方式,以便进程之间可以互相传输数据。

队列

队列是 Python 提供的一种多线程、多进程安全的数据结构,可以实现不同进程之间的数据交换。

from multiprocessing import Process, Queue

def writer(q, message):
    q.put(message)

def reader(q):
    print(q.get())

if __name__ == '__main__':
    q = Queue()
    p = Process(target=writer, args=(q, 'Hello,'))
    p2 = Process(target=writer, args=(q, 'World!'))
    p3 = Process(target=reader, args=(q,))
    p.start()
    p2.start()
    p3.start()
    p.join()
    p2.join()
    p3.join()

这个例子中,我们使用 Queue 来实现进程之间的数据交换。首先创建了一个队列对象,然后分别创建了两个写入进程和一个读取进程。写入进程通过调用 put 方法向队列中写入数据,读取进程通过调用 get 方法从队列中读取数据。

管道

管道也是一种多线程、多进程安全的数据结构,可以实现不同进程之间的双向数据交换。

from multiprocessing import Process, Pipe

def writer(p):
    p.send([i for i in range(10)])
    p.send([i for i in range(20, 30)])

def reader(p):
    print(p.recv())
    print(p.recv())

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=writer, args=(child_conn,))
    p2 = Process(target=reader, args=(parent_conn,))
    p.start()
    p2.start()
    p.join()
    p2.join()

在这个例子中,我们使用 Pipe 来实现双向数据交换。首先创建了一对管道对象,并分别将它们分配给父进程和子进程。父进程通过调用 send 方法向子进程写入数据,子进程通过调用 recv 方法读取父进程写入的数据。

共享内存

共享内存允许多个进程访问并修改相同的内存块,从而实现不同进程之间的数据共享。

from multiprocessing import Process, Array

def square(arr):
    for i in range(len(arr)):
        arr[i] **= 2

if __name__ == '__main__':
    arr = Array('i', [i for i in range(10)])
    p = Process(target=square, args=(arr,))
    p.start()
    p.join()
    print(arr[:])

在这个例子中,我们使用 Array 来实现多进程之间的数据共享。使用 Array 的构造函数创建一个数组对象,并将它分配给父进程和子进程。父进程将一个包含前十个整数的列表赋值给数组,子进程使用 square 函数将数组中的每个元素值求平方。最后在父进程中输出结果。

小结

在多核 CPU 上使用 Python 处理任务时,多进程提供了一种简单而实用的并行方案,能够充分利用计算机资源,提高程序执行效率。通过本文,您了解了 Python 中的多进程处理,包括如何创建进程、如何实现进程间通信等方面的知识。希望这些内容能够帮助您在实际项目中使用 Python 处理多进程任务。