(python)multiprocessing子进程(Process类的使用)总结教程

news2025/1/11 11:03:10

Python提供了multiprocessing模块来开启子进程,并在子进程中执行我们定制的任务。

(python)multiprocessing子进程(Process类的使用)

  • 两种使用方法
    • 第一种方法:使用Process类
    • 第二种方法:使用multiprocessing.Pool
  • 以下是两个实例,分别演示如何使用Process类和multiprocessing.Pool来创建和管理子进程。
    • 实例一:使用Process类
    • 实例二:使用multiprocessing.Pool
  • self.pool.starmap和pool.apply_async区别
    • self.pool.starmap
    • pool.apply_async
      • 异步执行期间,继续执行主进程代码
      • 进程池完成结束判断
  • 选择进程启动方法

两种使用方法

第一种方法:使用Process类

self.process = Process(target=Server, args=(self.zmqQThread.ipc_url0, self.zmqQThread.ipc_url1))
# self.process.daemon = True
self.process.start()

解释:这段代码直接创建一个Process对象,并启动一个新的进程来运行Server函数,传入self.zmqQThread.ipc_url0和self.zmqQThread.ipc_url1作为参数。
适用场景:这种方法适用于需要直接管理单个子进程的情况,尤其是当你需要在特定点启动和控制这个进程时。比如界面中需要调用一个子进程

第二种方法:使用multiprocessing.Pool

mp_context = multiprocessing.get_context('spawn')
pool = mp_context.Pool(processes=1)

解释:这段代码使用multiprocessing.get_context(‘spawn’)获取一个特定的上下文(这里是’spawn’),并基于这个上下文创建一个进程池(Pool)。
适用场景:这种方法适用于需要管理多个子进程的情况,尤其是在需要并行处理多个任务时。进程池可以有效地管理和分配多个任务给多个进程。这里需要程序需要处理多个任务时使用

以下是两个实例,分别演示如何使用Process类和multiprocessing.Pool来创建和管理子进程。

实例一:使用Process类

展示了如何直接使用Process类来启动一个单独的服务器进程。

import time
from multiprocessing import Process

def Server(ipc_url0, ipc_url1):
    print(f"Server started with IPC URLs: {ipc_url0}, {ipc_url1}")
    for _ in range(5):
        print("Server is running...")
        time.sleep(1)
    print("Server has finished running.")

class MyServer:
    def __init__(self, ipc_url0, ipc_url1):
        self.ipc_url0 = ipc_url0
        self.ipc_url1 = ipc_url1
        self.process = Process(target=Server, args=(self.ipc_url0, self.ipc_url1))

    def start(self):
        self.process.start()
        self.process.join()

if __name__ == '__main__':
    my_server = MyServer('ipc://localhost:5555', 'ipc://localhost:5556')
    my_server.start()
    print("Main process has finished.")

同步执行:
self.process.join()的作用是阻塞主进程,直到self.process进程结束。这确保了主进程会等待子进程完成后再继续执行后续代码。
在这里插入图片描述

实例二:使用multiprocessing.Pool

展示了如何使用multiprocessing.Pool来管理多个并行任务。在这个例子中,我们创建一个进程池,并使用它来并行执行多个任务。

import time
import multiprocessing

def worker(number):
    print(f"Worker {number} started")
    time.sleep(2)
    print(f"Worker {number} finished")

if __name__ == '__main__':
    # 使用 'spawn' 上下文创建进程池
    mp_context = multiprocessing.get_context('spawn')
    pool = mp_context.Pool(processes=3)  # 创建一个包含3个进程的池

    # 提交任务到进程池
    results = []
    for i in range(5):
        result = pool.apply_async(worker, args=(i,))
        results.append(result)

    # 等待所有任务完成
    for result in results:
        result.wait()

    pool.close()
    pool.join()
    print("All tasks have finished.")

异步执行
在这里插入图片描述

self.pool.starmap和pool.apply_async区别

self.pool.starmap

starmap方法类似于map,但它接受一个参数列表的列表,将这些参数解包传递给目标函数。这使得starmap非常适合需要传递多个参数的函数。

import multiprocessing
import time

def worker(x, y):
    print(f"Worker started with args: ({x}, {y})")
    time.sleep(2)
    return x + y

if __name__ == '__main__':
    with multiprocessing.Pool(processes=3) as pool:
        # 参数列表的列表
        args = [(1, 2), (3, 4), (5, 6), (7, 8)]
        # 使用 starmap 执行任务
        results = pool.starmap(worker, args)
        print("Results:", results)

在这里插入图片描述

pool.apply_async

apply_async方法允许异步地调度单个任务,并且可以立即返回一个AsyncResult对象。这个对象可以用于获取任务结果、检查任务状态或者等待任务完成。

import multiprocessing
import time


def worker(x):
    print(f"Worker started with arg: {x}")
    time.sleep(2)
    return x * x


if __name__ == '__main__':
    # 创建一个进程池
    with multiprocessing.Pool(processes=3) as pool:
        # 提交多个异步任务
        results = [pool.apply_async(worker, args=(i,)) for i in range(15)]

        # 可以在这里执行其他操作,不需要等待任务完成
        print("Main process continues to run while workers are processing.")

        # 获取任务结果
        for result in results:
            print("Result:", result.get())


    print("Main process has finished.")

在这里插入图片描述

异步执行期间,继续执行主进程代码

import multiprocessing
import time


def worker(x):
    print(f"Worker started with arg: {x}")


if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)

    # 提交第一批任务
    results1 = [pool.apply_async(worker, args=(i,)) for i in range(15)]

    # 提交第二批任务
    results2 = [pool.apply_async(worker, args=(i + 5,)) for i in range(15)]

    # 可以在这里执行其他操作,不需要等待任务完成
    print("Main process continues to run while workers are processing.")

    # 继续执行主进程的其他操作
    for i in range(5):
        print(f"Main process doing other work {i}")
        time.sleep(1)

    print("Main process has finished.")

在这里插入图片描述
上面进程池里的代码全部运行完,但是如果主进程比子进程快,那么子进程就会提前结束,那么为了避免进程池的任务提前结束未完成,则需要判断:

进程池完成结束判断

import multiprocessing
import time


def worker(x):
    print(f"Worker started with arg: {x}")


def init_pool():
    pool = multiprocessing.Pool(processes=4)
    return pool


def check_pool(results):
    # 检查任务状态
    while True:
        # 检查所有任务是否完成
        if all(result.ready() for result in results):
            print("All tasks are completed.")
            break
        else:
            print("Some tasks are still running...")
            time.sleep(0.2)  # 等待一段时间后再检查


if __name__ == '__main__':
    pool = init_pool()
    # 提交第一批任务
    results1 = [pool.apply_async(worker, args=(i,)) for i in range(15)]

    # 提交第二批任务
    results2 = [pool.apply_async(worker, args=(i + 5,)) for i in range(15)]

    # 可以在这里执行其他操作,不需要等待任务完成
    print("Main process continues to run while workers are processing.")
    results = results1 + results2
    # 继续执行主进程的其他操作
    for i in range(5):
        print(f"Main process doing other work {i}")
        pool.apply_async(worker, args=(100 + i,))

        # time.sleep(0.1)
    check_pool(results)

    print("Main process has finished.")

将其模块化:

  • init_pool初始化进程池,返回pool
  • check_pool检查进程池状态
  • results为组合进程池中的结果,没有返回结果一样可以用,如果worker中有return,则for result in all_results:result.get()

选择进程启动方法

通过 multiprocessing.get_context() 方法,你可以显式地选择进程启动方法,保证代码在不同平台上的行为一致。常见的启动方法有:

fork: 父进程被复制,子进程继承父进程的资源。这是 Unix 系统默认的启动方法。
spawn: 父进程启动一个全新的 Python 解释器,并在这个新解释器中导入必要的资源。这是 Windows 系统默认的启动方法,也是 Unix 系统的可选方法。
forkserver: 父进程启动一个单独的服务器进程,后续子进程通过与这个服务器通信来创建。这在某些情况下比 fork 更安全。

import multiprocessing
import time


def worker(x):
    print(f"Worker started with arg: {x}")
    time.sleep(2)
    print(f"Worker finished with arg: {x}")


if __name__ == '__main__':
    # 获取 spawn 启动方法的上下文
    mp_context = multiprocessing.get_context('spawn')
    
    # 使用 spawn 上下文创建进程池
    pool = mp_context.Pool(processes=4)
    
    # 提交任务
    results = [pool.apply_async(worker, args=(i,)) for i in range(5)]
    
    # 可以在这里执行其他操作,不需要等待任务完成
    print("Main process continues to run while workers are processing.")
    
    # 获取所有任务结果
    for result in results:
        result.wait()  # 等待任务完成
    
    # 关闭进程池
    pool.close()
    pool.join()

    print("Main process has finished.")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring框架和Maven项目搭建

Spring Spring框架是一个用于构建企业级应用程序的开源Java框架。它提供了一个全面的编程和配置模型,用于开发现代化的Java应用程序。 Spring从早期的大量XML配置逐渐演变为采用注解和自动配置的方式,显著减少了配置的工作量。同时,Maven的…

为什么Transformer需要进行 Multi-head Attention?

目录 1. 前言 2. 基本概念 2.1. Word2Vec 2.2. Attention is all you need 2.3. Self-attention 2.3.1. 概述self-attention 2.3.2. 训练细节 2.4. Multi-head Attention 2.4.1. 多头理论细节 2.4.2. 多头代码实现 2.5. 总结 3. 讨论观点 3.1. 观点1: …

Canto - hackmyvm

简介 靶机名称:Canto 难度:简单 靶场地址:https://hackmyvm.eu/machines/machine.php?vmCanto 本地环境 虚拟机:vitual box 靶场IP(Canto):192.168.130.53 windows_IP:192.1…

证书及公钥SHA256值计算方法

证书及公钥SHA256值计算方法 移除开头和结尾的标记以及所有空白字符Base64 解码进行 SHA-256 哈希运算 已有文件:证书(后缀如crt)获取网站证书方法不再赘述 以bilibili为例:浏览器访问:https://bilibili.com 查看证书 …

实验2-4-8 找出三位水仙花数

//实验2-4-8 找出三位水仙花数 //输出给定正整数M和N区间内的所有三位水仙花数 //三位水仙花数&#xff0c;即其个位、十位、百位数字的立方和等于该数本身#include<stdio.h> #include<math.h> int main(){int m,n;scanf("%d %d",&m,&n);//输入在…

Qt 的线性渐变的类QLinearGradient 学习笔记

QLinearGradient 是 Qt 中用于创建线性渐变的类&#xff0c;它允许你在控件上应用从一个颜色到另一个颜色的渐变效果。QLinearGradient 的参数用于定义渐变的方向、范围以及颜色变化。下面是 QLinearGradient 的各个主要参数及其详细解释&#xff1a;1. x1 和 y1 定义&#xff…

FFmpeg有理数相关的源码:AVRational结构体和其相关的函数分析

一、引言 有理数是整数&#xff08;正整数、0、负整数&#xff09;和分数的统称&#xff0c;是整数和分数的集合。整数也可看作是分母是1的分数。不是有理数的实数称为无理数&#xff0c;即无理数的小数部分是无限不循环的数。 AVRational是FFmpeg源码中的一个结构体&#xf…

企业邮箱如何支持免费试用?

企业邮箱如何支持免费试用&#xff1f;Zoho企业邮箱提供多种版本&#xff0c;支持免费试用&#xff0c;具备权威认证、信息安全、全球部署等特点。试用步骤包括访问官网、选择版本、输入信息、验证域名等。特色功能包括定制化界面、搜索、日程安排等。支持多种设备和操作系统。…

linux内核:文件系统的组织(超级块,索引节点,目录项,文件对象)

在虚拟文件系统中抽象了4个对象&#xff1a;超级块、索引节点、目录项和文件对象。 超级块&#xff1a;存放描述文件系统的有关信息。每个文件系统都有自己的超级块&#xff0c;不同文件系统的超级块不同。文件系统的超级块在文件系统安装时建立&#xff0c;在卸载时自动删除。…

【问题解决方案】npm install报错问题:npm ERR! - 多种解决方案,总有一种可以解决

文章目录 1.问题重述2.解决方案方案1.确认根目录正确方案2.确认文件名正确方案3. 确认node.js安装完成&#xff08;注意这个环境变量配置没有写完&#xff09;方案4 改用yarn安装&#xff08;亲测可用&#xff09; 3.延申问题解决方案问题1&#xff1a;需要低版本的node.js 写在…

【计算机毕业设计】727网上拍卖系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【ArcGIS+CityEngine】自行制作Lod1城市大尺度白膜数据

数据准备 50多个城市建筑矢量数据 链接&#xff1a;https://pan.baidu.com/s/1FiwTfXDwQ6tMDRACAwUZwQ 提取码&#xff1a;DYSK 数据分析 数据属性Floor&#xff0c;为建筑物楼层信息&#xff0c;据此信息下面将在CityEngine软件生成Lod1白膜数据。 软件准备 CityEngi…

MMPV+MMRV 打开物料账期

开物料账期&#xff1a;MMPV 查看物料账期&#xff1a;MMRV 可以看到当前期间和上一期间。 允许过账到上一期间&#xff1a;过账日期可以改到上一月。 物料账期只能一个月一个月的开&#xff0c;不能跨月开。最多打开两个月。 财务账期OB52

Introduction to Data Analysis with PySpark

1.DataFrame and RDDs 2.Spark Architecture 3. Data Formats and Data Sources 倘若您觉得我写的好&#xff0c;那么请您动动你的小手粉一下我&#xff0c;你的小小鼓励会带来更大的动力。Thanks.

【组合数学】【Python】【小练习】一、斯特灵近似式求阶乘

一、问题介绍 斯特灵&#xff08;Stirling&#xff09;近似式&#xff0c;是数学分析中&#xff0c;用于求阶乘近似值的一个常用公式&#xff0c;其简单的表述形式为&#xff1a; 二、Python实现 使用Python&#xff0c;循环从n1至n98&#xff0c;分别输出n的阶乘值、斯特灵公…

在 Debian Bookworm XFCE4 桌面环境中安装原生版 微信

絮絮叨叨&#xff1a; 最近在做一个POC验证&#xff0c;为了启用足够多的虚拟机集群&#xff0c;把自己办公 Debian 重装了&#xff0c;装成了XFCE4桌面环境&#xff0c;需要在这个桌面环境上安装常用的办公与会议工具&#xff0c;既满足POC验证环境所需、又不耽误办公写文档 …

超好用的图片批量处理工具,电商人都在用!你还不知道?

作为一名电商运营人或者经常和图片打交道的小伙伴&#xff0c;是不是经常被大量图片的处理工作搞得焦头烂额&#xff1f;今天我必须给大家分享一个超级实用的宝贝工具——图片批量处理神器&#xff01; 神器介绍&#x1f447; 千鹿设计助手&#xff0c;是一款轻量级、功能非常…

如何应对,AI发展带来的就业挑战和机遇?

机遇与挑战并存 AI Job Impact AI时代的就业挑战 随着AI技术的飞速发展&#xff0c;它对全球就业市场产生了深远影响。一方面&#xff0c;一些传统职位正逐渐被自动化取代&#xff1b;另一方面&#xff0c;AI也创造了大量新兴职位。面对这一变革&#xff0c;我们需积极适应&…

【Python实战因果推断】69_图因果模型4

目录 Querying a Graph in Python Querying a Graph in Python 在接下来的时刻&#xff0c;你将把这个图输入到一个Python库中&#xff0c;这将使得回答关于它的问题变得相当容易。但在你这样做之前&#xff0c;作为一项练习&#xff0c;为了更好地理解你刚刚学到的概念&#x…

(七)Appdesigner-初步入门及常用组件的使用方法说明

目录 前言 一、Appsesigner初步入门 &#xff08;一&#xff09;Appsesigner简介 &#xff08;二&#xff09;功能布局 二、常用组件 &#xff08;一&#xff09;基础知识 &#xff08;二&#xff09;实际操作 1.HTML 2.下拉框 3.切换按钮组 4.列表框 5.单选按钮组…