python多进程基础详解

2023-12-16Python编程
2

Python多进程基础详解

什么是多进程

进程是程序执行时的一个实例,每个进程都有独立的内存空间和系统资源。而多进程是指在同一时间内,存在多个进程在系统中运行,这些进程可以并发执行,互不干扰。

使用多进程可以显著提高程序的运行效率。Python中通过使用multiprocessing模块来实现多进程。

多进程的创建

创建多进程有两种方式:fork和spawn。在Windows操作系统上使用multiprocessing需要使用spawn方式。

fork方式

在Unix/Linux系统上可以使用fork方式创建多进程。fork方式是通过在父进程中调用os.fork()方法来创建一个子进程,并且子进程会完全复制父进程的环境变量、资源等。

示例代码:

import os

def child_process():
    print(f"Child process id: {os.getpid()}")

def parent_process():
    print(f"Parent process id: {os.getpid()}")
    print("Create child process.")
    pid = os.fork()
    if pid == 0:
        child_process()
    else:
        print(f"Created child process with pid: {pid}")

if __name__ == '__main__':
    parent_process()

输出:

Parent process id: 12345
Create child process.
Created child process with pid: 23456
Child process id: 23456

spawn方式

在Windows操作系统上使用spawn方式创建多进程。spawn方式是父进程生成一个新的Python解释器实例,并在这个新实例中执行子进程的代码。

示例代码:

from multiprocessing import Process
import os

def child_process():
    print(f"Child process id: {os.getpid()}")

def parent_process():
    print(f"Parent process id: {os.getpid()}")
    print("Create child process.")
    p = Process(target=child_process)
    p.start()
    p.join()

if __name__ == '__main__':
    parent_process()

输出:

Parent process id: 12345
Create child process.
Child process id: 23456

进程间通讯

多进程之间不能直接共享数据,需要通过进程间通讯来实现数据共享。

multiprocessing模块提供了多种进程间通讯的方式,如:Queue、Pipe等。

Queue

Queue是用于进程间通讯的队列,它本身是进程安全的。

示例代码:

from multiprocessing import Process, Queue
import os
import time

def child_process(queue):
    print(f"Child process id: {os.getpid()}")
    while True:
        if not queue.empty():
            msg = queue.get()
            print(f"Child process received msg: {msg}")
            if msg == 'finish':
                break
        time.sleep(1)

def parent_process():
    print(f"Parent process id: {os.getpid()}")
    q = Queue()
    p = Process(target=child_process, args=(q,))
    p.start()
    for i in range(5):
        q.put(f"msg {i}")
    q.put("finish")
    p.join()

if __name__ == '__main__':
    parent_process()

输出:

Parent process id: 12345
Child process id: 23456
Child process received msg: msg 0
Child process received msg: msg 1
Child process received msg: msg 2
Child process received msg: msg 3
Child process received msg: msg 4

Pipe

Pipe是用于进程间通讯的管道,它本身也是进程安全的。

示例代码:

from multiprocessing import Process, Pipe
import os
import time

def child_process(conn):
    print(f"Child process id: {os.getpid()}")
    while True:
        msg = conn.recv()
        print(f"Child process received msg: {msg}")
        if msg == 'finish':
            break
    conn.close()

def parent_process():
    print(f"Parent process id: {os.getpid()}")
    conn_parent, conn_child = Pipe()
    p = Process(target=child_process, args=(conn_child,))
    p.start()
    for i in range(5):
        conn_parent.send(f"msg {i}")
    conn_parent.send("finish")
    p.join()

if __name__ == '__main__':
    parent_process()

输出:

Parent process id: 12345
Child process id: 23456
Child process received msg: msg 0
Child process received msg: msg 1
Child process received msg: msg 2
Child process received msg: msg 3
Child process received msg: msg 4

总结

本文介绍了Python中使用multiprocessing模块实现多进程和进程间通讯的基础知识。其中包括多进程的创建方式,以及多种进程间通讯的方式。在实际开发中,多进程可以有效提升程序的运行效率,同时进程间通讯也是保证多进程并发执行的关键。

The End

相关推荐

解析Python中的eval()、exec()及其相关函数
Python中有三个内置函数eval()、exec()和compile()来执行动态代码。这些函数能够从字符串参数中读取Python代码并在运行时执行该代码。但是,使用这些函数时必须小心,因为它们的不当使用可能会导致安全漏洞。...
2023-12-18 Python编程
117

Python下载网络文本数据到本地内存的四种实现方法示例
在Python中,下载网络文本数据到本地内存是常见的操作之一。本文将介绍四种常见的下载网络文本数据到本地内存的实现方法,并提供示例说明。...
2023-12-18 Python编程
101

Python 二进制字节流数据的读取操作(bytes与bitstring)
来给你详细讲解下Python 二进制字节流数据的读取操作(bytes与bitstring)。...
2023-12-18 Python编程
120

Python3.0与2.X版本的区别实例分析
Python 3.x 是 Python 2.x 的下一个重大版本,其中有一些值得注意的区别。 Python 3.0中包含了许多不兼容的变化,这意味着在迁移到3.0之前,必须进行代码更改和测试。本文将介绍主要的差异,并给出一些实例来说明不同点。...
2023-12-18 Python编程
34

python如何在终端里面显示一张图片
要在终端里显示图片,需要使用一些Python库。其中一种流行的库是Pillow,它有一个子库PIL.Image可以加载和处理图像文件。要在终端中显示图像,可以使用如下的步骤:...
2023-12-18 Python编程
91

Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
在Python中,我们可以使用Pillow库来进行图像处理。具体实现两幅图像合成一幅图像的方法如下:...
2023-12-18 Python编程
103