首页 > 系统相关 >python进程绑定CPU的意义

python进程绑定CPU的意义

时间:2023-01-30 11:31:43浏览次数:48  
标签:绑定 python random 生产者 进程 import 100 CPU

1. 绑定CPU后对计算密集型的任务可能会一定程度上提升运算性能:(小幅度的性能提升,甚至小幅度落后,总之就是差别不大)

对比1代码A:

import os
from multiprocessing import Process
from timeit import timeit
import numpy as np


cpu_avia = os.sched_getaffinity(os.getpid())
os.sched_setaffinity(os.getpid(), list(cpu_avia)[:1]) # 绑定两个核心


def func():
s = np.random.random(100)

for _ in range(10000000):
s += np.random.random(100)


t = timeit('func()', "from __main__ import func", number=100)


print(t)

运行时间:

2340.2266417220235

 

 

对比1代码B:

import os
from multiprocessing import Process
from timeit import timeit
import numpy as np



def func():
s = np.random.random(100)

for _ in range(10000000):
s += np.random.random(100)


t = timeit('func()', "from __main__ import func", number=100)


print(t)

运行时间:

2321.7808491662145

 

 

==========================

 

 

对比2代码A:

import os
from multiprocessing import Process
from timeit import timeit
import numpy as np


cpu_avia = os.sched_getaffinity(os.getpid())
os.sched_setaffinity(os.getpid(), list(cpu_avia)[:1]) # 绑定两个核心


def func():
s = np.random.random(100)

for _ in range(1000000000):
s += np.random.random(100)


t = timeit('func()', "from __main__ import func", number=1)


print(t)

运行时间:

2405.4125552885234

 

 

对比2代码B:

import os
from multiprocessing import Process
from timeit import timeit
import numpy as np



def func():
s = np.random.random(100)

for _ in range(1000000000):
s += np.random.random(100)


t = timeit('func()', "from __main__ import func", number=1)


print(t)

运行时间:

2415.607121781446

 

 

可以说,绑定CPU其实对于算法的运行性能影响不大,即使有提升也是微乎其微的。但是对于绑定CPU的作用个人认为还是分隔计算资源才是最有用的应用,这就是本文要说的第二点。

 

 

-----------------------------------------

 

 

 

2. 绑定CPU后可以实现计算资源的分隔

场景:

1. 一个主机有8个CPU内核,现在计划用4个CPU内核运行生产者进程,另外4个CPU内核运行消费者进程。

2. 消费者进程为每个CPU核心上运行一个消费者进程,因为消费者进程为计算密集型任务,为保证消费者进程不被生产者进程抢占计算资源,因此把CPU核心0-3绑定给生产者进程,CPU核心4-7绑定给消费者进程。消费者进程共有4个。

3. 生产者进程需要接收网络数据并进行数据处理,然后把处理后的数据通过进程消息队列的方式传输给消费者进程;消费者进程则不断的从消息队列中读取数据进行下一步的处理。

4. 生产者进程需要接收的网络源有100个,即socket要开100个。

 

解决方案1:

为生产者进程单独设置一个网络数据接收进程,由该进程接收网络数据,然后把网络数据传递给生产者进程,这样生产者进程的进程数量设置为4个即可以保证绑定的CPU核心达到充分的利益。此时网络IO操作由网络接收进程负责,数据处理的计算任务由4个生产进程负责。该种设计简单的说就是生产者部分设置一个网络接收进程和4个生产者进程。大致总体设计如下:

python进程绑定CPU的意义_网络数据

 

此时又出现了新的问题,那就是网络数据接收进程如何维护对100个socket数据的读取操作,使用轮询机制还是多线程阻塞等待,还是用异步的方式,不同的方式性能会有如何的影响。

对于网络数据接收进程来说,设计性能最高的方式就是使用异步的方式,而设计操作最简单的就是多线程的方式。

 

 

 

解决方案2:

方案2其实是对方案1的改进和补充,方案1中生产者部分中单独采用了一个网络数据接受进程,然后由该进程接收数据后再传递给其他生产者进程,但是如果由于某些原因,如数据量较大、数据难以进行序列化等原因难以进行进程间传递,因此给出方案2。

python进程绑定CPU的意义_多线程_02

该种设计就是不使用网络数据接收进程,而是使用多个生产者进程的方式,每个生产者进程均负责一个socket数据的接收和处理。该种设计还是较大程度上依赖CPU锁定的设置,因为如果不是把这100个生产者进程锁定在0,1,2,3号CPU核心上,那么必然会出现100个进程同时进行数据处理而抢占消费者进程的计算资源的情况。

该种设计的最大好处就是简单,在编写具体代码的时候可以比较简单的快速完成;但是该种设置的最大坏处就是扩展性的问题,如果socket源过多,那么我们就需要建立大量的生产者进程,而大量的生产者进程进行切换的时候必然会占用资源,也就是说该种设计会随着生产进程数量的增加而极大的损失掉总体的性能。

 

这里再给出一个折中的方案,那就是在生产者进程中使用多线程或者异步,如下图:

python进程绑定CPU的意义_杂谈_03

一个生产者进程中带有10个线程,10个线程分别监听10个socket,当然这里也可以使用异步方式来解决。

 

 

PS: 之所以有上面复杂的几种方案,归根到底就是因为python的多线程不能并发执行,多进程之间通信会造成性能损耗以及多方面的限制问题。

 

 

=====================================

 

相关:

​​python进程绑定CPU的一些Demo​​

​​【转载】 python进程绑定CPU​​


标签:绑定,python,random,生产者,进程,import,100,CPU
From: https://blog.51cto.com/u_15642578/6026171

相关文章

  • python进程绑定CPU的一些Demo
    从​​中知道如何对python进程设置CPU绑定,本文对此进行一些延伸,给出一些例子:代码1:importosfrommultiprocessingimportProcessimporttimecpu_avia=os.sched_getaffini......
  • python文字转语音
    依赖pyttsx3库pipinstallpyttsx3 yuyin_test1.pyimportpyttsx3engine=pyttsx3.init()engine.say("Fourthlettersoftransitinthespringbreezeasyo......
  • 使用prometheus来避免Kubernetes CPU Limits造成的事故
    使用prometheus来避免KubernetesCPULimits造成的事故译自:UsingPrometheustoAvoidDisasterswithKubernetesCPULimits本文将介绍Kubernetes的resourcelimits是......
  • python3-pip
    一、pip介绍Python官网中的安装包中已经自带了pip,在安装时默认选择安装。安装完python后需要手动配置pip的环境变量,cmd命令可以查看pip是否可用:pip或者pip-h二、命令......
  • Python Numpy 中的打印设置函数set_printoptions
    一概述np.set_printoptions()用于控制Python中小数的显示精度。二解析np.set_printoptions(precision=None,threshold=None,linewidth=None,suppress=None,......
  • python2--安装es报错:error in elastic-transport setup command: 'install_requires'
    今天使用python2安装es模块时报错:  原因是pip(模块管理工具)版本过低,需先升级pip,再进行安装先替换pip的镜像,默认镜像拉取慢,还可能会失败cd~;mkdir.pip;touch.p......
  • python爬虫(二)- HTML解析之XPath
    HTML解析通过urllib、requests,都可以拿到HTML内容。HTML的内容返回给浏览器,浏览器就会解析它,并对它渲染。HTML超文本表示语言,设计的初衷就是为了超越普通文本,让文本表......
  • CPU/GPU/FPGA芯片分析
    CPU/GPU/FPGA芯片分析CPU由于并行性的限制和操作系统的调度,做通信效率不高,延迟也不稳定。 此外,通信就必然涉及到调度和仲裁,CPU由于单核性能的局限和核间通信的低效,......
  • Python用KShape对时间序列进行聚类和肘方法确定最优聚类数k可视化|附代码数据
    全文链接:http://tecdat.cn/?p=27078最近我们被客户要求撰写关于KShape的研究报告,包括一些图形和统计输出。时序数据的聚类方法,该算法按照以下流程执行。使用基于互相关......
  • curl_cffi: 支持原生模拟浏览器 TLS/JA3 指纹的 Python 库
    原文首发于我的博客:https://yifei.me/note/2719越来越多的网站开始使用TLS指纹反爬虫,而Python中竟然没有任何方法解决这个问题。前一阵看到由国外大神写了一个curl-......