【Python】多进程线程与CPU核数

news2024/10/7 20:25:07
  • 多进程数量设置为CPU核数,或者略小于CPU核数;
  • 多线程数量,如果是CPU密集任务设为1;如果是IO密集设为合理的值;
  • IO密集型:系统运作,大部分的状况是CPU 在等I/O (硬盘/内存)的读/写。
  • 计算密集型:大部份时间用来做计算、逻辑判断等CPU 动作的程序称之CPU 密集型。
  • 对于IO密集型,多线程效率高于多进程;
  • 对于计算密集型任务,多进程效率高于多线程。

总结一下

IO密集网络请求,文件读写多进程CPU核数(or略小于CPU核数)
多线程合理值
CPU密集计算,逻辑判断多进程CPU核数(or略小于CPU核数)
多线程1

GIL全局锁:是python多线程。

多进程设置的大小与CPU核数的关系

在Python中,多进程的数量可以根据CPU核数来设置,以充分利用计算资源并提高程序的性能。通常情况下,可以将多进程的数量设置为机器的CPU核数,或者略少于CPU核数,以避免过度竞争资源而导致性能下降。

以下是一些关于Python多进程设置大小与CPU核数的一般准则:

1. CPU核数:首先,你可以使用`multiprocessing`模块中的`cpu_count()`函数来获取机器的CPU核数。例如:

import multiprocessing

num_cpus = multiprocessing.cpu_count()

2. 多进程数量:根据机器的CPU核数,你可以将多进程的数量设置为相应的值。通常情况下,将多进程数量设置为CPU核数是一个合理的选择。例如:

num_processes = num_cpus

3. 考虑资源竞争:在设置多进程数量时,需要考虑到每个进程所需的资源(如内存、I/O等)。如果每个进程需要较多的资源,可以将多进程数量设置为略少于CPU核数,以避免过度竞争资源而导致性能下降。

需要注意的是,多进程的设置也取决于具体的应用场景和任务类型。有时候,根据具体情况进行实验和调整,找到最佳的多进程数量可能是更好的选择。此外,还可以考虑使用线程(`threading`模块)来实现并发操作,具体取决于任务的性质和需求。

多线程设置的大小与CPU核数的关系

在Python中,多线程的设置大小与CPU核数之间的关系是相对简单的。由于Python的全局解释器锁(GIL)机制限制了多线程的并行执行,因此多线程并不能充分利用多核处理器的能力。

在Python中,多线程适用于I/O密集型任务,如网络请求、文件读写等,因为这些任务通常会涉及等待时间而在等待的过程中,其他线程可以继续执行。因此,对于I/O密集型任务,可以将多线程的数量设置为适当的值,以充分利用CPU的等待时间。

然而,对于CPU密集型任务,由于GIL的存在,多线程并不能实现真正的并行加速。在这种情况下,多线程的数量增加并不会提高程序的性能,反而可能由于线程之间的频繁切换而导致性能下降。因此,在CPU密集型任务中,通常建议将多线程的数量设置为1,以避免不必要的开销。

综上所述,多线程的设置大小与CPU核数之间的关系在Python中并不直接相关。对于I/O密集型任务,可以适当增加多线程的数量以充分利用CPU的等待时间;对于CPU密集型任务,通常将多线程的数量设置为1即可需要根据具体的应用场景和任务类型来确定最佳的多线程设置。

参考:

python多进程 - 新战鲸的文章 - 知乎

多线程和进程比较

对于IO密集型,多线程效率高于多进程;

对于计算密集型任务,多进程效率高于多线程。

代码如下:

# -*- coding: utf-8 -*-
""" 
@Time:        2023/4/18 14:42
@Author:      CookieYang
@FileName:    threadVsProcess.py
@SoftWare:    PyCharm
@brief:       功能简介
"""
import time
from threading import Thread
from multiprocessing import Process


def f1():
    # time.sleep(1)  #io密集型
    # 计算型:
    n = 10
    for i in range(10000000):
        n = n + i

if __name__ == '__main__':
    # 查看一下100个线程执行100个任务的执行时间
    t_s_time = time.time()
    t_list = []
    for i in range(100):
        t = Thread(target=f1,)
        t.start()
        t_list.append(t)
    [tt.join() for tt in t_list]
    t_e_time = time.time()
    t_dif_time = t_e_time - t_s_time
    print('===================================')
    # 查看一下100个进程执行同样的任务的执行时间
    p_s_time = time.time()
    p_list = []
    for i in range(100):
        p = Process(target=f1,)
        p.start()
        p_list.append(p)
    [pp.join() for pp in p_list]
    p_e_time = time.time()
    p_dif_time = p_e_time - p_s_time
    print('多线程的执行时间:',t_dif_time)
    print('多进程的执行时间:',p_dif_time)

 

Ubuntu判断进程、线程是IO密集型还是计算密集型 

判断方式(看最后的):

如果voluntary_ctxt_switches 远远小于 nonvoluntary_ctxt_switches,就表示该任务是计算密集型的。

反之voluntary_ctxt_switches 远远大于 nonvoluntary_ctxt_switches,就表示该任务是io密集型的。 

进程池

简单用了一下multiprocessing的进程池,非阻塞的apply_async版本,代码如下:

# -*- coding: utf-8 -*-
""" 
@Time:        2023/4/18 14:31
@Author:      CookieYang
@FileName:    multiprocess00L.py
@SoftWare:    PyCharm
@brief:       功能简介
"""

# coding: utf-8
import multiprocessing
import time


def func():
    msg = "ok"
    print("msg:", msg)
    time.sleep(0.01)
    print("end")


if __name__ == "__main__":
    pool = multiprocessing.Pool(processes=3)
    for i in range(20):
        msg = "hello %d" % (i)
        pool.apply_async(func)  # 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去

    print("wait close~~~~~~~~~~~~~~~~~~~~~~")
    pool.close()
    pool.join()  # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束
    print("done")

还有map版本的:

# -*- coding: utf-8 -*-
""" 
@Time:        2023/4/18 14:25
@Author:      CookieYang
@FileName:    multiprocessL.py
@SoftWare:    PyCharm
@brief:       功能简介
"""
import time
from multiprocessing import Pool


def f(x):
    time.sleep(10)
    # n = 10
    # for i in range(10000000):
    #     n = n + i
    return x * x


if __name__ == '__main__':
    with Pool() as p:
        max_count = 10000
        time1 = time.time()
        res = p.map(f, range(1, max_count + 1))
        print(sum(res))
        time2 = time.time()
        print(f"{max_count},耗时:{time2 - time1:.2f}秒")

并发是指多进程还是多线程

python并发是指多进程还是多线程。

Python中的并发可以指多进程并发和多线程并发,两者都是实现并发执行的方式,但有一些区别。

多进程并发是通过创建多个独立的进程来实现的,每个进程有自己独立的内存空间和资源,它们可以并行执行不同的任务。多进程并发可以充分利用多核处理器的能力,适用于CPU密集型任务。在Python中,可以使用`multiprocessing`模块来实现多进程并发。

多线程并发是在同一个进程内创建多个线程来执行任务,这些线程共享进程的内存空间和资源。由于Python的全局解释器锁(GIL)机制的存在,多线程并不能实现真正的并行执行,只能在单个CPU核上进行切换执行。因此,多线程并发适用于I/O密集型任务,如网络请求、文件读写等。在Python中,可以使用`threading`模块来实现多线程并发。

需要根据具体的应用场景和任务类型选择适合的并发方式。对于CPU密集型任务,多进程并发可能更适合;对于I/O密集型任务,多线程并发可能更适合。同时,还可以结合多进程和多线程的方式来实现更高效的并发执行,例如使用`concurrent.futures`模块中的线程池和进程池。

如何理解并发

并发是指在同一时间段内,多个任务或操作同时进行或交替执行的能力。它是一种并行执行的概念,但并发的实现方式可以有多种。

在计算机领域,并发通常用于提高系统的性能和资源利用率。通过并发执行,可以使多个任务或操作在同一时间段内共享计算机的资源,如CPU、内存、磁盘等,从而提高系统的吞吐量和响应能力。

并发可以通过多进程、多线程、协程等方式实现。多进程并发是通过创建多个独立的进程来执行任务,每个进程有自己独立的资源和执行环境。多线程并发是在同一个进程内创建多个线程来执行任务,这些线程共享进程的资源。协程是一种轻量级的线程,可以在同一个线程内实现并发执行,通过协作的方式进行任务切换。

并发的好处在于可以提高系统的响应速度、资源利用率和用户体验。例如,在一个网络服务器中,通过并发处理多个客户端请求,可以提高服务器的吞吐量和并发连接数。在一个图像处理应用中,通过并发执行多个图像处理任务,可以加快处理速度。

然而,并发也带来了一些挑战,如资源竞争、同步和通信等问题。在并发编程中,需要注意对共享资源的访问控制,避免数据竞争和死锁等问题。同时,还需要合理地设计任务调度和通信机制,以确保并发执行的正确性和效率。

综上所述,理解并发意味着理解在同一时间段内多个任务或操作的同时执行或交替执行的能力,以及实现并发的不同方式和应用场景。

并发与并行

并发和并行(图解) - deeplearning的文章 - 知乎(并发,并行的概念看该链接)

总结

  1. 并发针对单核 CPU 而言,它指的是 CPU 交替执行不同任务的能力;
  2. 并行针对多核 CPU 而言,它指的是多个核心同时执行多个任务的能力。
  3. 单核 CPU 只能并发,无法并行;换句话说,并行只可能发生在多核 CPU 中。
  4. 在多核CPU中,并发和并行一般都会同时存在,它们都是提高 CPU 处理任务能力的重要手段。

我们现在使用的应该都是多核CPU了。

大概理解一下,并行指的是每个核都执行1个任务。并发指的是在每个核内部可以同时交替执行多个任务。

并发+并行

执行任务的数量恰好等于 CPU 核心的数量,是一种理想状态。

但是在实际场景中,处于运行状态的任务是非常多的,尤其是电脑和手机,开机就几十个任务,而 CPU 往往只有 4 核、8 核或者 16 核,远低于任务的数量.

这个时候就会同时存在并发和并行两种情况:所有核心都要并行工作,并且每个核心还要并发工作。例如,一个双核 CPU 要执行四个任务,它的工作状态如下图所示:

每个核心并发执行两个任务,两个核心并行的话就能执行四个任务。当然也可以一个核心执行一个任务,另一个核心并发执行三个任务,这跟操作系统的分配方式,以及每个任务的工作状态有关系。

引子

一开始梳理这些关系的原因。

服务端开30个进程+100个线程。
这里引发的思考,多线程是不是针对客户端来说的呢?就是你调用模型的时候你可以开多线程,请求服务端的域名呗。
就服务端(模型部署本身来说),有一套pipeline,就是下载图片+图像处理+前向推理+softmax返回结果,这个流程怎么开多线程呢?
梳理完基础概念之后我的回答:请求下载图片的时候,请求访问下图链接,这是IO密集型任务,可以通过多线程并发来提高效率。

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

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

相关文章

单链表的建立(头插法、尾插法)(数据结构与算法)

如果要把很多个数据元素存到一个单链表中,如何操作? 1.初始化一个单链表 2. 每次取一个数据元素,插入到表尾/表头 1. 尾插法建立单链表 尾插法建立的单链表元素顺序与输入数据集合的顺序相同,即按照输入数据的顺序排列。 使用尾插…

【蓝桥杯选拔赛真题09】C++输出回文数 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++输出回文数 一、题目要求 1、编程实现 2、输入输出 二、算法分析

MySQL中表的增删改查

目录 一、CRUD 二、新增(Create) (1)语法 (2)单行数据全列插入 (3)多行数据指定列插入 三、查询(Retrieve) (1)语法 …

vue3 + vite 安装配置及项目创建

node 和 npm 安装就不讲了&#xff0c;需要注意的是 node 需要版本是 16 以上。 VUE官网&#xff1a; https://cn.vuejs.org/ 一. 安装vue vite 1. 安装vue 方法一&#xff1a;<script> 标签 CDN 引入方式 <script src"https://unpkg.com/vue3/dist/vue.glo…

小米11 安装面具magisk 实现root

为了在安卓上抓包chatgpt 只能root小米11 来安装抓包工具小黄鸟 才能安装根证书来解析https。 1.官方解锁 2.下载小米11 安卓12 的开发版本 venus_images_V13.0.6.1.15.DEV_20220308.0000.00_12.0_cn_cb6b0c891f.tgz 进入刷机fastboot 3.进系统开启usb调试模式&#xff0c;…

GraphPad Prism v10.0.0.3(医学统计分析绘图软件)

GraphPad Prism 是一款医学统计和绘图软件&#xff0c;主要用于生物医学研究、实验设计和数据分析。以下是 GraphPad Prism 的主要功能和特点&#xff1a; 数据导入和整理&#xff1a;GraphPad Prism 可以导入各种数据格式&#xff0c;并提供直观的界面用于整理、编辑和管理数据…

PY32F071单片机,主频最高72 M,带一路DAC,USB

PY32F071 系列微控制器采用高性能的 32 位 ARM Cortex-M0内核&#xff0c;宽电压工作范围的 MCU。嵌入高达128 Kbytes flash 和 16 Kbytes SRAM 存储器&#xff0c;最高工作频率 72 MHz。包含多种不同封装类型多款产品。芯片集成多路 I2C、SPI、USART 等通讯外设&#xff0c;1 …

linux中各种最新网卡2.5G网卡驱动,不同型号的网卡需要不同的驱动,整合各种网卡驱动,包括有线网卡、无线网卡、Wi-Fi热点

linux中各种最新网卡2.5G网卡驱动&#xff0c;不同型号的网卡需要不同的驱动&#xff0c;整合各种网卡驱动&#xff0c;包括有线网卡、无线网卡、自动安装Wi-Fi热点。 最近在做路由器二次开发&#xff0c;现在市面上卖的新设备&#xff0c;大多数都采用了2.5G网卡&#xff0c;…

flutter项目引入本地静态图片资源并展示

想要在flutter中引入静态资源&#xff0c;需要配置pubspec.yaml&#xff0c;将本地的静态资源添加到assets下面&#xff1a; 然后在flutter引入这些静态资源&#xff1a; Image.asset("images/squick.png") 就可以在app中看到这个图片了&#xff1a; 也可以使用网…

vue使用Web Speech API实现语音播报

SpeechSynthesisUtterance对象用于表示要播放的语音内容&#xff0c;SpeechSynthesis对象则用于控制语音的播放、暂停、停止等操作。 const synth window.speechSynthesis const msg new SpeechSynthesisUtterance() // 语音播放 const playVoice (text) > {synth.canc…

双热点机制结合。5+铜死亡+铁死亡相关基因生信思路

今天给同学们分享一篇结合铜死亡和铁死亡相关基因预测肿瘤预后、免疫和药敏的生信文章“A novel signature of combing cuproptosis- with ferroptosis-related genes for prediction of prognosis, immunologic therapy responses and drug sensitivity in hepatocellular car…

如何翻译SCI论文, 中译英哪里比较专业?

众所周知&#xff0c;SCI论文是被科学引文索引(SCI)收录的期刊上发表的论文。SCI论文是学术界内具有较高影响力和引用率的文章&#xff0c;通常被高度认可和重视。因此&#xff0c;SCI论文翻译对译员的要求很高。那么&#xff0c;如何翻译SCI论文&#xff0c; 中译英哪里比较专…

Oracle-执行计划

执行计划生成的几种方式 1. EXPLAIN FOR 语法&#xff1a; EXPLAIN PLAN FOR SQL语句SELECT * FROM TABLE(dbms_xplan.display());优点&#xff1a; 无需真正执行SQL 缺点&#xff1a; 没有输出相关的统计信息&#xff0c;例如产生了多少逻辑读、物理读、递归调用等情况无法判…

【考研数据结构代码题2】删除单链表倒数第n个结点

题目&#xff1a;删除单链表倒数第n个结点 难度&#xff1a;★ 算法思路&#xff1a; 首先题目没有指明链表的长度&#xff0c;多以首先需要编写一个函数getLength()来求表长&#xff0c;其次删除倒数第n个结点&#xff0c;即删除正数第length-n1个结点&#xff0c;这是二者之间…

章鱼网络进展月报 | 2023.10.1-10.31

章鱼网络大事摘要 1、Louis 成功竞选 NDC 的 HoM 议席&#xff0c;将会尽最大努力推动 NEAR 变革。2、章鱼网络受邀参加在土耳其主办的 Cosmoverse2023&#xff0c;分享 Adaptive IBC 的技术架构。3、2023年10月8日章鱼日&#xff0c;是章鱼网络主网上线2周年的纪念日。 …

WebDAV之π-Disk派盘 + Smart File Manager

推荐一款超级文件管理器手机版。不仅可以自建热点分享,还可以用电脑查看和下载手机上的文件,支持连接云盘服务。 Smart File Manager是一款简洁、强大、小巧完美的文件管理应用程序,它能自动识别用户内部存储器中所有的文件信息,包括音乐、视频、图片、APK、下载、文件、压…

【计算机网络】数据链路层——以太网协议

目录 1.完整的数据传输流程2.以太网以太网通信原理以太网帧格式MAC地址对比MAC地址和IP地址MTU 3.ARP协议ARP协议的作用ARP协议的格式ARP协议的原理 1.完整的数据传输流程 IP拥有将数据跨网络从一台主机送到另一台主机的能力&#xff0c;但IP并不能保证每次都能够将数据可靠的送…

欧洲爆火的Vinted是什么平台?值得入驻吗?如何入驻?

近年来&#xff0c;Vinted已经成为欧洲最受欢迎的在线二手服装买卖市场之一。该平台因其用户友好的界面、丰富的商品选择以及在用户之间创建的社区感而备受关注。在本文中&#xff0c;我们将更详细地了解Vinted的运作方式以及您开始出售商品需要知道的内容。 一、什么是Vinted&…

[动态规划] (四) LeetCode 91.解码方法

[动态规划] (四) LeetCode 91.解码方法 91. 解码方法 题目解析 (1) 对字母A - Z进行编码1-26 (2)11106可以解码为1-1-10-6或者11-10-6, 但是11-1-06不能解码 (3) 0n不能解码 (4) 字符串非空&#xff0c;返回解码方法的总数 解题思路 状态表示 dp[i]&#xff1a;以i为结…

接口自动化测试难点:数据库验证解决方案 百分之90人不知道

接口自动化中的数据库验证&#xff1a;确保数据的一致性和准确性 接口自动化测试是现代软件开发中不可或缺的一环&#xff0c;而数据库验证则是确保接口返回数据与数据库中的数据一致性的重要步骤。本文将介绍接口自动化中的数据库验证的原理、步骤以及示例代码&#xff0c;帮…