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

  • 多进程数量设置为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密集型任务,可以通过多线程并发来提高效率。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 要在Linux中查询CPU核心数,可以使用以下命令之一: 1. 使用lscpu命令:输入"lscpu"命令并按回车键,它将显示处理器和CPU信息,包括CPU核心数。在输出中找到“Core(s) per socket”字段,它将告诉你CPU中的核心数。 2. 使用nproc命令:输入"nproc"命令并按回车键,它将返回CPU核心数的数字。要查询Linux系统中CPU的核心数,可以通过以下方法: 1. 打开终端窗口。 2. 在终端窗口中输入命令 `lscpu` 并按下回车键。 3. 在输出结果中,查找 CPU(s) 字段下的值,即可得到 CPU 核心数。 注意:如果您的 Linux 系统没有安装 `lscpu` 命令,可以尝试通过 `cat /proc/cpuinfo` 命令来查询 CPU 核心数。要查询Linux系统中的CPU核数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 这将输出一个数字,表示系统中的CPU核心数。要查询 Linux 系统的 CPU 核数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "processor" | wc -l ``` 这个命令会打印出 CPU 相关的信息,并使用管道(`|`)将输出传递给 `grep` 命令,查找包含 "processor" 关键词的行。然后再将输出传递给 `wc -l` 命令,用于计算包含 "processor" 关键词的行的数量,也就是 CPU 核数。最后输出的数字即为 CPU 核数。要查询Linux操作系统中CPU的核心数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 该命令会打印出CPU的核心数,例如: ``` cpu cores : 4 ``` 上述输出表示该系统中CPU有4个核心。要查询 Linux 操作系统中的 CPU 核数,您可以使用以下命令: ``` cat /proc/cpuinfo | grep "core id" | sort | uniq | wc -l ``` 这个命令会输出计算机上的 CPU 核心数量。您可以使用以下命令在 Linux 系统上查询 CPU 核数: ``` cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 该命令将打印出每个 CPU 核心的相关信息,并且使用 uniq 命令可以将重复的信息过滤掉,最终输出每个 CPU核数。要在Linux系统中查询CPU核数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "cpu cores" ``` 这将显示每个CPU核心的数量,可以方便地查看计算机的CPU信息。你可以通过在终端中运行以下命令来查询Linux系统中的CPU核数: ``` cat /proc/cpuinfo | grep "processor" | wc -l ``` 这将输出你的系统中的CPU核心数。要查询 Linux 系统中的 CPU 核数,可以通过以下步骤: 1. 打开终端窗口(Terminal)。 2. 输入命令:`nproc`。 3. 按下回车键。 这个命令会输出 CPU核数,例如输出“4”,表示系统中有 4 个 CPU 核心。要在Linux系统中查询CPU核数,可以使用以下命令: ``` grep -c 'processor' /proc/cpuinfo ``` 这将打印出CPU核数的数量。要在Linux系统中查询CPU核数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 这个命令会打印出CPU核数,例如,如果你的系统有8个核心,命令输出的结果应该是: ``` cpu cores : 8 ``` 可以使用 cat /proc/cpuinfo 命令查看Linux系统中CPU核数。要查询 Linux 系统中 CPU核数,可以通过以下命令在终端中执行: ``` grep -c ^processor /proc/cpuinfo ``` 执行此命令后,终端会输出 CPU 核数的数字。要查询 Linux 操作系统下的 CPU 核心数,您可以使用以下命令: ``` cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 这个命令将会读取 /proc/cpuinfo 文件,然后使用 grep 命令过滤出包含 "cpu cores" 的行,最后使用 uniq 命令去除重复的行。命令执行后,终端将输出您的计算机上 CPU 的核心数。要查询Linux操作系统的CPU核数,可以使用以下命令: ``` grep -c ^processor /proc/cpuinfo ``` 这个命令将会输出CPU核心数目。要查询 Linux 系统中的 CPU 核数,可以通过命令行输入以下命令来实现: ```bash cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 执行该命令后,会输出系统 CPU 核数的信息。要在Linux中查询CPU核数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 这个命令会打印出系统中每个CPU核数,如果系统有多个CPU,则会分别列出它们的核数。 可以在Linux终端中输入"cat /proc/cpuinfo"来查看CPU的核心数量。要在 Linux 中查询 CPU 核数,您可以打开终端并运行以下命令: ``` cat /proc/cpuinfo | grep "core id" | uniq | wc -l ``` 这将显示您的 Linux 系统上的 CPU 核心数。要查询Linux系统中CPU核数,可以使用以下命令之一: 1. 使用lscpu命令: 在终端中输入命令lscpu并按回车键即可。该命令将显示有关CPU架构的详细信息,包括核心数、线程数等。 2. 使用nproc命令: 在终端中输入命令nproc并按回车键即可。该命令将返回系统上可用的CPU核心数。 3. 使用cat /proc/cpuinfo命令: 在终端中输入命令cat /proc/cpuinfo并按回车键即可。该命令将显示有关CPU的详细信息,包括核心数、线程数等。 你可以使用Linux的lscpu命令来查询CPU核数,例如:lscpu | grep '^CPU(s):' | head -1 可以使用命令 'cat /proc/cpuinfo' 来查询 linux 系统中 CPU 的核心数量。要在Linux中查询CPU核数,可以使用以下命令: ``` grep 'processor' /proc/cpuinfo | wc -l ``` 这个命令会在`/proc/cpuinfo`文件中查找`processor`这个关键词,并统计它出现的次数,即CPU核数。在 Linux 系统中,可以使用以下命令来查询 CPU核数: ``` cat /proc/cpuinfo | grep "processor" | wc -l ``` 执行该命令后,终端会返回 CPU 核数的数量。 你可以使用命令行查询Linux系统的CPU核数,可以使用命令"cat /proc/cpuinfo"查看CPU核数信息。要在Linux系统中查询CPU核数,可以使用以下命令: ``` grep 'processor' /proc/cpuinfo | wc -l ``` 这个命令会打印出CPU核数的数量。 可以使用命令"lscpu"查看Linux系统中CPU核数。 你可以使用命令行工具查询Linux系统中CPU核数,例如cat/proc/cpuinfo。 可以使用命令行工具lscpu来查询Linux系统的CPU核数,例如:lscpu | grep "^CPU(s):" | head -1要在Linux系统中查询CPU核数,可以使用以下命令: ``` lscpu | grep "^CPU(s):" ``` 这将显示出类似于以下内容的输出: ``` CPU(s): 8 ``` 这里的数字 8 表示当前计算机的 CPU 核心数量。 你可以通过在终端中输入“cat /proc/cpuinfo”来查询Linux服务器上的CPU核心数量。要查询 Linux 操作系统下的 CPU 核心数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 这个命令会打印出每个 CPU 核心的详细信息,然后使用 grep 命令过滤出包含 "cpu cores" 的行,最后使用 uniq 命令去除重复的行,从而得到 CPU 核心数的信息。要在Linux系统中查询CPU核数,可以使用以下命令: ``` grep -c ^processor /proc/cpuinfo ``` 这个命令会输出CPU核心数的数量,例如如果你的计算机有8个CPU核心,那么输出结果应该是: ``` 8 ``` 使用Linux的"cat /proc/cpuinfo"命令可以查询CPU核数。要在 Linux 系统中查询 CPU 核数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "processor" | wc -l ``` 这个命令将打印出 CPU 的详细信息,并通过管道符将其传递给 grep 命令进行过滤,以查找包含 "processor" 字符串的行。然后,将结果传递给 wc 命令以计算行数,从而得到 CPU 核心数量。要在Linux上查询CPU核心数量,可以使用以下命令: ``` grep -c processor /proc/cpuinfo ``` 这将在`/proc/cpuinfo`文件中查找包含“processor”关键字的行数,并将其作为CPU核心数量输出。 ### 回答2: Linux是一种开放源代码的操作系统,随着其在服务器领域的日益普及,了解如何查询CPU核数变得尤为重要。 在Linux中,我们可以使用命令行工具来查询CPU核数。以下是两种最常见的方法: 方法1:使用lscpu命令 lscpu命令是Linux系统中用于查询CPU信息的工具。它可以提供各种关于CPU的信息,包括CPU核数。要使用lscpu命令,请打开终端窗口并输入以下命令: lscpu 这个命令将输出所有与CPU有关的信息,包括CPU型号、CPU核数、每个CPU中的逻辑处理器数量等等。在命令输出中,可以查找”CPU(s)”并找到CPU核数。 方法2:使用nproc命令 nproc命令提供一个快速的方法来查询CPU核数。要使用nproc命令,请打开终端窗口并输入以下命令: nproc 这个命令将直接输出CPU核数。如果你需要使用CPU核数信息在脚本中进行其他操作,那么nproc命令将是一个更好的选择。 总结 以上是两种最常用的查询Linux系统中CPU核数的方法。lscpu命令提供了更详细的CPU信息,而nproc命令则更加简单直接。如果你需要在自己的脚本中使用CPU核数信息,那么nproc命令会更加方便和实用。 ### 回答3: 在Linux系统中,我们可以通过多种方式来查询CPU核数。下面将介绍三种常见的方法。 方法一:通过lscpu命令查询 该命令可以列出系统CPU的相关信息,包括CPU的型号、核数线程数、缓存信息等等。在终端中输入以下命令: lscpu 其中CPU核数信息可以在输出结果中的“Core(s) per socket”字段中查看。 方法二:通过/proc/cpuinfo文件查询 在Linux系统中,/proc目录下存放了大量的系统信息,其中cpuinfo文件记录了CPU的相关信息。在终端中输入以下命令: cat /proc/cpuinfo | grep "cpu cores" 其中grep命令用于对输出信息进行过滤,只显示包含“cpu cores”的行。输出结果中的数字即为CPU核数。 方法三:通过nproc命令查询 nproc命令用于查询CPU核数,其直接返回整数值。在终端中输入以下命令: nproc 输出结果即为CPU核数。 综上所述,查询Linux系统中CPU核数有多种方法,包括lscpu命令、/proc/cpuinfo文件和nproc命令。可以根据实际需要选择适合的方式进行查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值