当前位置: 首页 > 面试题库 >

在Linux上使用Taskset在多核系统上使用Python Global Interpreter Lock(GIL)解决方法?

解沈义
2023-03-14
问题内容

因此,我刚刚看完有关Python全局解释器锁(GIL)http://blip.tv/file/2232410的演讲。

要点是,GIL是用于单核系统的不错的设计(Python本质上将线程处理/调度留给了操作系统)。但是,这可能会在多核系统上造成严重后果,最终导致IO密集型线程被CPU密集型线程严重阻塞,上下文切换的开销,ctrl-
C问题[*]等。

因此,由于GIL限制了我们只能在一个CPU上基本执行Python程序,所以我的想法是为什么不接受它,而只是在Linux上使用任务集将程序的亲和力设置为系统上的某个核心/
cpu(尤其是在在多核系统上运行的多个Python应用)?

所以最终我的问题是:是否有人尝试在Linux上将Python和Python应用程序一起使用任务集(尤其是在Linux系统上运行多个应用程序,以便多个内核可以与绑定到特定内核的一个或两个Python应用程序一起使用时),如果是的话,该怎么办?是结果吗?这值得吗?对于某些工作负载,情况是否会变得更糟?我打算这样做并对其进行测试(基本上看该程序是否需要花费更多或更少的时间来运行),但希望能从其他人那里得到您的经验。

另外:David Beazley(在链接的视频中进行演讲的人)指出,某些C / C
++扩展手动释放GIL锁定,如果这些扩展针对多核进行了优化(即科学或数字数据分析等),则而不是使用多核的数字处理优势,因为扩展仅限于单个核(因此可能会显着降低程序速度),因此实际上会遭到破坏。另一方面,如果您不使用此类扩展名

我不使用多处理模块的原因是(在这种情况下)程序的一部分受到了网络I /
O的严格限制(HTTP请求),因此拥有工作线程池是从根本上降低性能的一种好方法一个线程触发一个HTTP请求,然后由于它正在等待I /
O而放弃了GIL,而另一个线程可以做到这一点,因此该程序的一部分可以轻松地运行100个以上的线程,而又不会对CPU造成很大的伤害,而让我实际使用可用的网络带宽。至于无堆栈Python
/ etc,我对重写程序或替换我的Python堆栈并不太感兴趣(可用性也将是一个问题)。

[*]只有主线程可以接收信号,因此,如果您发送ctrl-C,Python解释器基本上会尝试使主线程运行,以便它可以处理信号,但是由于它不能直接控制运行哪个线程(它基本上由操作系统决定),它基本上告诉操作系统保持切换线程,直到最终到达主线程为止(如果您不走运,可能需要一段时间)。


问题答案:

我从未听说有人使用Taskset来提高Python的性能。这并不意味着您的情况不会发生,而是一定要发布您的结果,以便其他人可以批评您的基准测试方法并提供验证。

不过,就我个人而言,我将使用消息队列将I / O线程与CPU绑定的线程解耦。这样,您的前端现在完全受网络I /
O约束(有些使用HTTP接口,有些使用消息队列接口),非常适合您的线程情况。然后,CPU密集型进程可以使用多进程,也可以只是单个进程,等待工作到达消息队列。

从长远来看,您可能还需要考虑用Twisted或诸如eventlet之类的东西来替换线程化的I
/ O前端,因为即使它们对性能没有帮助,它们也应该提高可伸缩性。您的后端现在已经可以扩展,因为您可以根据需要在任意数量的计算机+ CPU上运行消息队列。



 类似资料:
  • 我有一个项目,我在几个不同的线程中观察几个节点。现在,我注意到,当我观察一个节点时,它发生了变化,引发了一个事件,某个节点上的观察(例如称为a)会阻止所有其他观察者。因此,只有在A上的观察者完成后,另一个观察者才会返回以观察节点的变化。也就是说,如果一个节点在其观察程序被阻止时发生了更改(例如称为B),则只有在a上的观察程序完成后,节点B上的观察程序才会引发该事件。 此问题会导致应用程序变慢。 所

  • 本文向大家介绍python在linux系统下获取系统内存使用情况的方法,包括了python在linux系统下获取系统内存使用情况的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python在linux系统下获取系统内存使用情况的方法。分享给大家供大家参考。具体如下: 将上面的代码保存为:memorymonitor.py 调用方法如下: 希望本文所述对大家的Python程序设计有所帮助

  • 问题内容: 如何在基于Linux的系统上的ac程序中使用mqueue(消息队列)? 我正在寻找一些好的代码示例,这些示例可以显示如何以正确和适当的方式(可能是方法)来完成此操作。 问题答案: 下面是一个简单的服务器示例,该服务器从客户端接收消息,直到接收到“ exit”消息告诉其停止为止。 服务器 的代码: 客户端 代码: 在 常见的 头: 编译 :

  • 问题内容: Linux中有没有可用的软件可以编译包含多核或分布式系统上并行大量文件的源代码。像gcc或xserver这样的库在单核/双机上花费大量时间进行编译,并且在大多数情况下,当您需要大量重新编译时,它们令人沮丧。有什么技术可以并行编译这些源代码? 问题答案: 在分布式内存系统上,可以使用distcc将编译作业分配给其他计算机。这需要一些设置,但是如果碰巧有一些额外的机器,它确实可以加快构建速

  • 本文向大家介绍在Linux上安装和使用Docker的方法,包括了在Linux上安装和使用Docker的方法的使用技巧和注意事项,需要的朋友参考一下 容器现在风靡于 IT 界 —— 这很好理解。容器是轻量级的,包含应用运行所需所有东西(代码、库、运行时环境、系统设置,以及依赖关系)的独立的包。每个容器都部署于它自己的 CPU、内存、块 I/O,以及网络资源上,所有这些都不依赖于某个内核和操作系统。这

  • 问题内容: 在Windows上,我具有以下代码来查找输入而不会中断循环: 但是,看到没有,在Linux上实现相同目标的最简单方法是什么? 问题答案: 上面引用的ncurses howto可能会有所帮助。这是一个示例,说明如何像conio示例一样使用ncurses: 请注意,对于ncurses,不使用标头。这是因为将stdio与ncurses混合会产生意外结果。 顺便说一下,ncurses定义和。正