【工程实践】python实现多进程

news2024/10/7 16:16:05

1 多线程与多进程

        Python中比较常见的并发方式主要有两种:多线程和多进程。

1-1 多线程

        多线程即在一个进程中启动多个线程执行任务。一般来说使用多线程可以达到并行的目的,但由于Python中使用了全局解释锁GIL的概念,导致Python中的多线程并不是并行执行,而是“交替执行”。类似于下图。

        所以Python中的多线程适合IO密集型任务,而不适合计算密集型任务。Python提供两组多线程接口,一是thread模块_thread,提供低等级接口。二是threading模块,提供更容易使用的基于对象的接口,可以继承Thread对象来实现线程,此外其还提供了其它线程相关的对象,例如Timer,Lock等。

1-2 多进程

         由于Python中GIL的原因,对于计算密集型任务,Python下比较好的并行方式是使用多进程,这样可以非常有效的使用CPU资源。当然同一时间执行的进程数量取决你电脑的CPU核心数。在支持多任务操作系统中,一个应用程序会被分解成多个独立运行的较小的程序。操作系统会将这些线程分配到多核处理器,以提升系统性能。执行过程如下图。每个进程都拥有自己的地址空间、内存、文件描述符和其他系统资源。多进程的好处在于可以使程序并行执行,从而提高程序的运行效率。

        如果每个子进程执行需要消耗的时间非常短(执行+1操作等),这不必使用多进程,因为进程的启动关闭也会耗费资源。当然使用多进程往往是用来处理CPU密集型(科学计算)的需求,如果是IO密集型(文件读取,爬虫等)则可以使用多线程去处理。

2 多进程实现

2-1 multiprocessing

2-1-1 Process

        multiprocessing模块提供了一个Process类,可以用来创建和管理进程。下面是一个简单的示例。

multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
参数介绍:
    1. group默认为None(目前未使用)
    2. target代表调用对象,即子进程执行的任务
    3. name为进程名称
    4. args调用对象的位置参数元组,args=(value1, value2, ...)
    5. kwargs调用对象的字典,kwargs={key1:value1, key2:value2, ...}

    6. daemon表示进程是否为守护进程,布尔值    
方法介绍:

    1.Process.start() 启动进程,并调用子进程中的run()方法

    2. Process.run() 进程启动时运行的方法,在自定义时必须要实现该方法       

    3.Process.terminate() 强制终止进程,不进行清理操作,如果Process创建了子进程,会导致该进程变成僵尸进程  

    4.Process.join() 阻塞进程使主进程等待该进程终止  

    5.Process.kill() 与terminate()相同  

    6.Process.is_alive() 判断进程是否还存活,如果存活,返回True  

    7.Process.close() 关闭进程对象,并清理资源,如果进程仍在运行则返回错误  

import multiprocessing

def worker(x,y,z):
    """该函数将在子进程中执行"""
    print(x,y,z)

if __name__ == '__main__':
    # 创建子进程
    p = multiprocessing.Process(target=worker,args = (1,2,3))
    # 启动子进程
    p.start()
    # 等待子进程结束
    p.join()

        在上面的代码中,worker函数将在子进程中执行。首先,创建了一个Process对象,指定target参数为worker函数。然后,通过调用start方法启动子进程,最后调用join方法等待子进程结束。

        示例:        

def get_final_result(chunk):
    #以任意一chunk为实例进行处理,其余的chunk均按照此逻辑运行
    for index in tqdm((range(len(chunk)))) :
        str_data = chunk[index]
        test_dict = ast.literal_eval(str_data)
        text = test_dict['text'].split('航空公司不会')[0].split('如需')[0].split('若需')[0].split('服务电话')[0].split('服务热线')[0].split('热线')[0].split('客服电话')[0].split('请拨打')[0].split('请打')[0].split('致电')[0].split('联系')[0].split('来电')[0]
        text = text.replace('(','').replace(')','').replace('(','').replace(')','')
        label = test_dict['label']
        result = get_result(text)
        write_file(result)
    
if __name__ == "__main__":
    #读入航班信息
    file_path = '/home/zhenhengdong/WORk/SMS_Parsing/规则/Data/原始_airports.json'
    with open(file_path, 'r', encoding='utf8') as f:
        json_filedata = f.readlines()
    #启动进程池
    pool = multiprocessing.Pool(20)
    #划分chunk
    chunks = [json_filedata[start:start + 1000] for start in range(0, len(json_filedata), 1000)]
    #将所有的chunk统一传进处理函数中
    results = pool.map(get_final_result,chunks)

2-1-2 Pool

        如果需要创建大量的进程,那么使用Process类可能会导致系统资源的浪费。此时,可以使用Pool类来创建进程池。下面是一个简单的示例。

import multiprocessing

def worker(num):
    """该函数将在子进程中执行"""
    print('Worker %d' % num)

if __name__ == '__main__':
    # 创建进程池
    pool = multiprocessing.Pool(4)
    # 启动进程池中的进程
    pool.map(worker, range(10))
    # 关闭进程池
    pool.close()
    # 等待进程池中的进程结束
    pool.join()

        在上面的代码中,Pool类的构造函数中指定了进程池的大小为4,然后通过调用map方法来启动进程池中的进程。map方法会将worker函数和range(10)序列中的每个元素一一对应,然后将它们作为参数传递给进程池中的进程。最后,调用close方法关闭进程池,并调用join方法等待所有进程结束。

2-2 partial

        针对一些特殊需求,需要对map函数传递两个或者多个参数,这时单纯的map函数已经不能满足需求了,就需要借助偏函数来完成。

        偏函数是python自带的包,直接导入就能用。偏函数partial的第一个参数就是所承载的原函数,之后原函数的参数再依次传入partial函数。

from functools import partial
#定义
def add_num(x, y):
    return x + y
# 承载add_num函数,并传入第一个参数
para = partial(add_num, 3)
# 传递第二个参数,就是把2传给para
result = para(2)
# 输出最后的结果
print(result)

2-3 Pool与partial处理数据​​​​​​​

import multiprocessing
import functools

def drop_app_index(drop_list, chunk):
    for element in tqdm(drop_list):
        chunk = chunk.drop(index = chunk[(chunk.pkg_name == element)].index.tolist())
    return chunk

pool = multiprocessing.Pool(20)
drop_list = list(data['pkg_name'].value_counts().keys())[600:]
print(len(drop_list))
# 将DataFrame拆分为多个片段
chunks = [data.iloc[start:start + 10000] for start in range(0, len(data), 10000)]
#偏函数
g_with_a = functools.partial(drop_app_index, drop_list)
results = pool.map(g_with_a,chunks)
#results = pool.map(partial(process_chunk,drop_list),chunks)
# 合并所有处理结果
df_result = pd.concat(results)
data = df_result.reset_index(drop=True)

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

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

相关文章

Doo Prime 德璞资本:怎么买原油期货?原油期货买卖策略分享

随着中国经济市场的逐步开放,也为了快速和国际金融接轨,我国于2018年3月26日正式挂牌上市原油期货交易。并且我国的原油期货交易合约和美原油期货和布伦特原油期货交易是相互影响的,这让中国投资者可以足不出户的进行原油期货投资。那么在国内…

Jconsole 开启远程连接遇到的一些坑

最近在学习 JVM,其中涉及到性能、内存等指标分析需要使用工具分享,Java 提供了几个可视化工具来监控和管理 Java 应用,比如 Jconsole、JVisual、JMC,他们以图形化的界面实时的监控程序各种性能指标以及内存、CPU 的使用情况。 Jco…

Triton教程 --- 模型管理

Triton教程 — 模型管理 Triton系列教程: 快速开始利用Triton部署你自己的模型Triton架构模型仓库存储代理模型设置优化动态批处理速率限制器 Triton 提供的模型管理 API 是 HTTP/REST 和 GRPC 协议的一部分,也是 C API 的一部分。 Triton 以三种模型控制模式之一…

5.实用干货-你可能没留意的几个生信基础

Reads:高通量测序平台产生的序列。 Raw Reads:原始下机数据称为Raw Reads(Raw data)。 Clean Reads:通过生物信息的方法,去除一些质量差的reads(比如测序错误,长度小于20的reads&a…

TypeScript零基础入门之背景介绍和环境安装

一、什么是TypeScript TypeScript是一种由微软开发和维护的开源编程语言。它是JavaScript的超集,意味着任何JavaScript程序都是一种有效的TypeScript程序。TypeScript添加了静态类型、类、接口、枚举和命名空间等概念,同时支持ES6特性。TypeScript被视为…

Flutter 初探原生混合开发

转载请注明出处:https://blog.csdn.net/kong_gu_you_lan/article/details/131320733?spm1001.2014.3001.5501 本文出自 容华谢后的博客 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用,从最早的Java到后来的RN、Weex,到现在的Co…

每日学术速递6.11

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Video-ChatGPT: Towards Detailed Video Understanding via Large Vision and Language Model 标题:Video-ChatGPT:通过大型视觉和语言模型实现详细的视频理…

SCI论文插图怎么做?有这一篇文章就够了

SCI插图的整体要求 SCI杂志种类很多,对插图的要求也各有不同,但是以下几条是通用的: 1. 插图尺寸要符合SCI期刊要求 2. 同篇文稿插图中文字须统一字号及字体 3. 须提交SCI期刊指定文件类型的插图 4. 插图文件命名须符合SCI期…

C++基础(15)——STL常用算法(遍历和查找)

前言 本文介绍了C中STL常用遍历和查找算法。 9.1:常用遍历算法(for_each、transform) 9.1.1:foreach for_each:遍历容器,transform:搬运一个容器中的数据到另一个容器中 for_each中使用普通…

自建iOS消息推送服务Bark

老苏的 DSM6.17 系统恢复之后,发现丢了一些套件,在安装 phpMyAdmin 套件时,显示需要用到 PHP7.4 但是在套件里搜索却只有 PHP7.3 从 https://archive.synology.cn/download/Package/PHP7.4 下载了最低的 7.4.9-0003 手动安装时居然显示 DSM6.…

Java进程调度的基本过程(详细易理解)

目录 一.什么是进程? 二.进程是如何创建的 三.进程如何调度的 优先级: 状态: 记账信息: 上下文: 线程是什么: 为什么要有线程: 坏处: 一.什么是进程? 了解这个问题之前,我们需要先打开我们桌面上的的学习资料 啪的一下,很快啊,点双击学习资料.exe之后,在后台(ctrl…

spring security oauth2 整合 JWT

前言 在这个基础上&#xff0c;进行整合。 spring security oauth2学习 -- 快速入门_本郡主是喵的博客-CSDN博客 1.jwt的一般使用 先把 reids,common-pools 等依赖删掉。 删掉redis的下相关配置 1.1 导入依赖 <!--jjwt--><dependency><groupId>io.json…

正则表达式(2)

文章目录 正则表达式一.正则表达式1.含义2.通配符2.1通配符含义作用2.2常见的通配符 3.元字符&#xff08;字符匹配&#xff09;4.表示次数5.位置锚定6.分组或其他 二.扩展正则表达式1.表示次数2.举例 正则表达式 一.正则表达式 1.含义 &#xff08;1&#xff09;是一种特殊…

基于Java智慧城市实验室主页系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

一、枚举类型——常量特定方法

Java 的枚举机制可以通过为每个枚举实例编写不同的方法&#xff0c;来赋予它们不同的行为。要实现这一点&#xff0c;你可以在枚举类型中定义一个或多个抽象方法&#xff0c;然后为每个枚举实例编写不同的实现&#xff0c;例如&#xff1a; ConstantSpecificMethod.java import…

使用 TensorFlow.js 将机器学习引入您的 Web 应用程序

如何使用 TensorFlow.js 在您的 Web 应用程序中实施机器学习 原文作者: Abhay Singh Rathore 机器学习 (ML) 不再是一个崇高、遥不可及的概念。借助 TensorFlow.js 等库&#xff0c;开发人员现在可以将 ML 整合到他们的 Web 应用程序中。例如&#xff0c;您可以创建一个系统&am…

革新智造业丨云和恩墨数据智能产品 zAIoT 将工控设备KPI分析性能提升百倍

点击关注 随着智能制造业的迅猛发展&#xff0c;工控设备在生产过程中起到至关重要的作用。为了确保生产效率和产品质量的提高&#xff0c;企业需要对工控设备进行全面的分析和评估。 工控设备KPI是指在生产线/车间设备的运行和维护过程中&#xff0c;需要监控的关键指标参数&a…

Vue----Vue的模板语法

【原文链接】Vue----Vue的模板语法 Vue 模板语法的描述 Vue使用一种基于HTML的模板语法&#xff0c;使我们能够声明式地将其组件实例的数据绑定到呈现的DOM上&#xff0c;所有的Vue模板都是语法层面合法的HTML&#xff0c;可以被符合规范的浏览器和HTML解析器解析 文本插值 …

Java性能权威指南-总结16

Java性能权威指南-总结16 线程与同步的性能线程池与ThreadPoolExecutor设置最大线程数设置最小线程数 线程与同步的性能 能够轻松编写多线程程序也是Java的一个标志性特征。Java性能方面的吸引力显而易见&#xff1a;如果有两个CPU可用&#xff0c;那么一个应用能够完成的工作…

计算机网络笔记(更新中)

本文是个人笔记&#xff0c;都是概念&#xff0c;没基础不建议看。 绪论 计算机网络的定义 最简单的定义&#xff1a;计算机网络是一些互相连接的、自治的计算机的集合因特网&#xff08;Internet&#xff09;是“网络的网络” 计算机网络的组成&#xff08;物理组成&#x…