python多进程基础详解

yizhihongxing

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模块实现多进程和进程间通讯的基础知识。其中包括多进程的创建方式,以及多种进程间通讯的方式。在实际开发中,多进程可以有效提升程序的运行效率,同时进程间通讯也是保证多进程并发执行的关键。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python多进程基础详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Python实现繁体中文与简体中文相互转换的方法示例

    Python实现繁体中文与简体中文相互转换的方法示例,可以使用第三方库opencc,以下是详细攻略: 1. 安装和导入opencc 使用pip命令安装opencc: pip install opencc 在Python脚本中导入opencc: import opencc 2. 简体中文转换为繁体中文示例 定义opencc的转换器,并使用该转换器将文本中的简体…

    python 2023年5月20日
    00
  • TensorBoard 计算图的可视化实现

    TensorBoard 是 Tensorflow 的一个可视化工具,可以帮助我们实现模型的可视化、调试,以及一些高级的分析功能。其中,计算图的可视化功能就是 TensorBoard 的一个重要的部分,它可以直观地展示模型的结构、参数和流程等复杂信息,让我们更好地理解模型的内部实现以及优化方法。在这里,我们就来详细讲解如何实现 TensorBoard 计算图的…

    python 2023年6月3日
    00
  • 微信 用脚本查看是否被微信好友删除

    下面是针对“微信 用脚本查看是否被微信好友删除”的完整攻略,包含了具体的步骤和两个示例说明。 1. 需要的工具和环境 Python 3.7 或以上版本 微信开发者工具 一个微信小程序应用的 AppID 2. 步骤 2.1 创建一个微信小程序 首先,我们需要创建一个微信小程序,用于获取当前用户的好友列表信息。 在微信公众平台的开发者中心中,可以创建一个小程序并…

    python 2023年6月3日
    00
  • SQLAlchemy – Python 编程错误’转换小数会丢失精度’,’HY000′

    【问题标题】:SQLAlchemy – Python Programming Error ‘Converting decimal loses precision’, ‘HY000’SQLAlchemy – Python 编程错误’转换小数会丢失精度’,’HY000’ 【发布时间】:2023-04-06 13:59:01 【问题描述】: 我正在使用 SQL A…

    Python开发 2023年4月7日
    00
  • Python学习笔记之抓取某只基金历史净值数据实战案例

    以下是“Python学习笔记之抓取某只基金历史净值数据实战案例”的完整攻略: 步骤1:导入必要的库 在开始之前,需要导入必要的库。在这个案例中,我们需要使用requests库来发送HTTP请求,使用BeautifulSoup库来解析HTML页面。 import requests from bs4 import BeautifulSoup 步骤2:发送HTTP…

    python 2023年5月14日
    00
  • python实现简易内存监控

    让我们来讲解一下“Python实现简易内存监控”的攻略。 1. 背景介绍 内存监控是一种常用的系统性能监控手段,可以帮助我们及时发现内存泄漏、分析应用程序内存使用等问题。本文将介绍如何使用Python实现一款简易内存监控程序。 2. 实现步骤 2.1. 安装依赖库psutil 使用Python实现内存监控需要安装psutil库,它是一个跨平台的进程和系统信息…

    python 2023年6月3日
    00
  • 匹配中文汉字的正则表达式介绍

    以下是“匹配中文汉字的正则表达式介绍”的完整攻略: 一、问题描述 在中文文本处理中,经常需要使用正则表达式来匹配中文汉字。本文将详细讲解如何使用正则表达式匹配中文汉字。 二、解决方案 2.1 匹配中文汉字的正则表达式 在正则表达式中,中文汉字的Unicode编码范围为\u4e00-\u9fa5。因此,我们可以使用\u4e00-\u9fa5来匹配中文汉字。以下…

    python 2023年5月14日
    00
  • SpringBoot +Vue开发考试系统的教程

    一、前言 SpringBoot+Vue开发考试系统是一个基于Java语言和Vue框架的在线考试系统,采用前后端分离模式进行开发设计,前端部分使用Vue实现,后端部分使用SpringBoot实现,使用Maven进行项目管理,数据库采用MySQL,实现了在线考试、成绩查询、试卷管理等基本功能。 二、创建SpringBoot项目 1.在IDEA中创建SpringB…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部