首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python C扩展-在每个纯C调用周围添加Py_BEGIN_ALLOW_THREADS有什么坏处吗?

在每个纯C调用周围添加Py_BEGIN_ALLOW_THREADS的目的是为了释放全局解释器锁(GIL),允许其他线程在纯C代码执行期间运行。这在某些情况下可以提高多线程程序的性能。

然而,使用Py_BEGIN_ALLOW_THREADS也存在一些潜在的问题和注意事项:

  1. 线程安全性:在释放GIL后,纯C代码可能会访问共享的数据结构或资源,这可能导致竞态条件和数据不一致的问题。因此,在使用Py_BEGIN_ALLOW_THREADS时,必须确保纯C代码是线程安全的,或者采取适当的同步措施来保护共享资源。
  2. Python对象操作:在纯C代码中,无法直接操作Python对象,因为GIL被释放。如果纯C代码需要操作Python对象,必须在重新获取GIL之后才能进行。这可能会导致性能下降,因为频繁地获取和释放GIL会引入开销。
  3. GIL争夺:当多个线程同时尝试获取GIL时,会发生GIL争夺的情况。这可能导致线程间的竞争和延迟,从而降低程序的性能。因此,在使用Py_BEGIN_ALLOW_THREADS时,需要仔细评估并确保其对性能的实际影响。

总结起来,使用Py_BEGIN_ALLOW_THREADS可以在某些情况下提高多线程程序的性能,但需要注意线程安全性和Python对象操作的问题。在实际应用中,需要根据具体情况进行评估和测试,以确定是否使用Py_BEGIN_ALLOW_THREADS以及如何使用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

从伪并行的 Python 多线程说起

这样每个物品在被处理的过程中便总是能保证全局环境不会突变。 GIL 保证了线程安全性,但很显然也带来了一个问题:每个时刻只有一条线程执行,即使多核架构中也是如此——毕竟,解释器只有一个。...使用 C 扩展 GIL 并不是完全的黑箱,CPython 解释器层提供了控制 GIL 的开关——这就是 Py_BEGIN_ALLOW_THREADS 和 Py_END_ALLOW_THREADS 宏。...这一对宏允许你自定义的 C 扩展中释放 GIL,从而可以重新利用多核的优势。 沿用上面的例子,自定义的 C 扩展函数好比是流水线上一个特殊的物品。...这里同样用一个 C 扩展做演示。...除了调用 Py_BEGIN_ALLOW_THREADS,解释器还会在发生阻塞 IO(如网络、文件)时释放 GIL。

1.2K10

Python中的GIL机制详解

大家应该都知道,python一个GIL(全局解释器锁),用于控制多线程的并发行为。 注:GIL不是必须的,可以通过对每个资源单独加锁的方式去掉GIL,也就是将GIL换成更细粒度的锁。...GIL锁的实现 Linux上的POSIX线程的实现有如下行为: 1、同一个线程多次调用pthread_mutex_lock,linux中默认类型的锁第二次调用总会堵塞 2、一个已经锁住的锁,其他线程调用..._Py_Ticker的值,这个值可以通过如下查看: python -c 'import sys;print(sys.getcheckinterval())' 100 默认是100,这个值可以认为是执行的字节码条数的一个计数器...注:python3.2的时候已经不是通过指令条数来切换了,而是时间间隔 python -c 'import sys;print(sys.getswitchinterval())' 0.005 2、IO...Python允许执行block型的system call之前允许其他线程执行(Py_BEGIN_ALLOW_THREADS),然后再重新尝试获取GIL(Py_END_ALLOW_THREADS)。

37320
  • 全局锁,锁住怎么办???

    讨论普通的 GIL 之前,一点要强调的是 GIL 只会影响到那些严重依赖 CPU 的程序(比如计算型的)。...事实上,一个写的不好的 C 语言扩展会导致这个问题更加严重,尽管代码的计算部分 会比之前运行的更快些。 说了这么多,现在想说的是我们两种策略来解决 GIL 的缺点。...主要思想是将计算密集型任务转移给 C,跟 Python 独立,工作的时候 C 代码中释放 GIL。...C 扩展最重要的特征是它们和 Python 解释器是保持独立的。...也就是说,如果你准 备将 Python 中的任务分配到 C 中去执行,你需要确保 C 代码的操作跟 Python 保持独立,这就意味着不要使用 Python 数据结构以及不要调用 PythonC

    49120

    一文理解Python的全局解释器锁(GIL)

    什么是 GILGIL是Python解释器中的一个互斥锁,它确保同一时刻只有一个线程能够执行Python字节码。...类似的,由于Python是解释执行的,如果你将那些性能瓶颈代码移到一个C语言扩展模块中, 速度也会提升的很快。如果你要操作数组,那么使用NumPy这样的扩展会非常的高效。...r = some_work(args) ...使用多进程的方式如果你完全工作于Python环境中,你可以使用 multiprocessing 模块来创建一个进程池, 并像协同处理器一样的使用它,每个进程独立的...C,跟Python独立,工作的时候C代码中释放GIL。...Py_END_ALLOW_THREADS ...}如果使用其他工具访问C语言,比如对于Cython的ctypes库,你不需要做任何事。 例如,ctypes调用C时会自动释放GIL。

    1.3K21

    比Mojo慢68000倍,Python性能差的锅该给GIL

    那么问题来了,为什么是个编程语言就比 Python 快呢?Python 高性能、多线程方面为什么这么为人诟病?本文将以 Python PEP 703 草案的相关内容为核心,分析个中原因。... Python 中,每个线程执行 Python 字节码的时候都需要持有 GIL,这意味着,多个线程的 Python 字节码解释事实上会被 GIL 强制变为串行执行。...而且,GIL 的出现使得一些线程不安全的 C 模块能很容易地被暴露给 CPython 调用而不用担心各种隐蔽的问题,这样的表现对于一个胶水语言来说实在是无可挑剔。...GIL 后依然让 Python 虚拟机保持移除前的单核性能移除 GIL 会令 Python 扩展模块的开发变复杂,因为所有的扩展模块都需要考虑被多线程调用的情况了 很难做到移除 GIL 后依然让...Python 虚拟机保持移除前的单核性能 移除 GIL 会令 Python 扩展模块的开发变复杂,因为所有的扩展模块都需要考虑被多线程调用的情况了 另外, Python 社区中,CPython 的维护者对于去掉

    60640

    预备小菜:Python入门之变量与函数

    1.数据类型 Python中使用变量是不需要声明。每个变量使用前都必须要赋值,变量赋值以后该变量才会被创建。...难道Python不会计算这么大的加减法?并不是,这是因为前面的赋值,age=20的赋值操作的时候,age的指的是20的这个“盒子”。...如下代码: name="小明" print(type(name)) #字符串类型 name=21 print(type(name)) #整型 PS:弱类型好处也有坏处...函数名命名跟之前的变量命名规则一样,但是为了能一眼看出这个函数的功能是什么,命名需要符合日常编码规范。函数名后面跟着(), 最后用“:”结尾。“()”中可以可以添加参数,也可以不用写,表示无参方法。...#函数定义 def my_sum(a,b): ab =a+b return ab #函数调用 print(my_sum(1,2)) my_sum(a,b)就是返回值的函数,a和b就是my_sum

    27230

    php ffi是什么?,什么是PHP外部函数接口?

    PHP外部函数接口(FFI)是PHP 7.4中的接口,使开发人员可以使用PHP创建扩展和对外部(也称为“外部”)库的绑定。  他们还可以使用它来调用C函数并访问C数据结构。...为什么PHP外部函数接口很重要?PHP中的外部函数接口是具有开创性的,因为以前,开发人员只能创建扩展和对外部(也称为“外部”)库的绑定-并使用C语言编写的PHP扩展和绑定来调用C函数并访问C数据结构。...FFI的历史和地位是什么? 外部函数接口最初Python和LuaJIT中可用,并且使这些语言对于快速原型制作非常有用。如今,许多语言都具有这种类型的界面。...它最初是PHP 7.4中引入的,仍被认为是实验性的。到2020年,社区可能会在扩展添加更多功能,并提高其性能。它会取代PHP扩展?现在说还为时过早,尽管PHP中的此接口不太可能会取代PHP扩展。...撰写此博客时,几乎每种情况下,PHP的此接口都比C / C ++扩展慢。

    41800

    编程基础知识:函数签名学习

    Python总是从每个函数返回一个对象,所以没有指定返回类型的签名: def add(a, b): pass C指定返回类型和每个参数的类型: int add(int a, int b); Java...多快?使用其他资源是什么?如果你通过了错误类型的论点?一个有效的参数范围? 例如,对于动态类型语言,如Python不指定参数或返回值的类型,你可以通过任何形式的数字:int,浮点小数,字符串。...整数溢出的情况下,Python可以让内部异常传播或处理并将结果转换为浮动或小数。在所有语言的函数可以使用内存缓存查找之前调用的结果或日志每个调用数据库或远程日志服务。...如何设计你的函数签名 函数签名的主要门户功能程序的其余部分。许多潜在的调用者主要关心他们传递的参数,因为他们可能继续函数返回时使用它们。例如,如果一个函数修改一个参数调用者需要知道。...考虑下面的签名C: void mystery(int * x); “神秘”功能可以修改其“x”的论点。为了避免意外,试图限制的能力“伤害”你的函数。支持它的语言,使用不可变说明符像“常量。

    1.1K50

    使用Cython加速Python代码

    与许多其他编程语言相比,Python的确很慢。 几种不同的方法可以使代码提速: 如果你的代码是Python。...文末下载Cython相关书籍 什么是Cython? Cython的核心是PythonC / C++之间的一个中间步骤。...你对Python代码所做的唯一调整就是向每个变量添加类型信息。...通常,我们可以像这样Python中声明一个变量: x = 0.5 使用Cython,我们为该变量添加一个类型: cdef float x = 0.5 这告诉Cython,变量是浮点数,就像我们C中所做的一样...对于Python,变量的类型是动态确定的。Cython中类型的显式声明使其转为C代码成为可能,因为显式类型声明需要+。 很多办法来测试、编译和发布 Cython 代码。

    1.7K41

    【模型解读】“不正经”的卷积神经网络

    cnn有这个能力。 前面我们说过pooling,它有一定的平移不变性,而且网络越深,越强大。但是,它的这个能力仍然是有限的,受卷积核大小和感受野大小的约束。 尺度不变性和旋转不变性呢?...首先我们看什么是不规矩,下图来自于【1】。 ? a图大家很熟悉,标准的3*3卷积核,而b,c,d虽然也是9个采样点,但是每个采样点相对于中心点的偏移与a很不一样。b是一个通用的展示,即完全没有规律。...什么好处呢? ? 我们看上面的一张图,假如我们一个分割任务,要分割出图中的尺度不同的动物。 我们先看左边的图,标准的卷积,感受野必然是一个方方正正的区域。...顶图一个中心像素,它的感受野是3*3,到了中间的图,周围四个角点又可以进一步扩展感受野,直到底部的图。...坏处主要是增加了参数量与计算量,不过这个计算量其实不大,可以通过分组进行控制。

    45310

    CMake基础

    CMake基础 一、什么是编译器 编译器,是一个根据源代码生成机器码的程序 g++ main.cpp -o a.out 该命令会调用编译器程序g++,让他读取main.cpp中的字符串(称为源码),并根据....cpp和.o重复写 g++ 命令(%.o: %.cpp) 但坏处也很明显: 1.make Unix 类系统上是通用的,但在 Windows 则不行 2.需要准确地指明每个项目之间的依赖关系...,头文件时特别头疼 3.make 的语法非常简单,不像 shell 或 python 可以做很多判断等 4.不同的编译器不同的 flag 规则,为 g++ 准备的参数可能对 MSVC 不适用...四、构建系统的构建系统CMake 为了解决 make 的以上问题,跨平台的 CMake 应运而生: 只需要写一份 CMakeLists.txt,他就能够调用时生成当前系统所支持的构建系统 CMake...tips:add_definitions(NOMINMAX) 可以C++定义变量为min/max不受到std中的min/max影响 8.第三方库的引入 头文件引入: 有时候我们不满足于 C++ 标准库的功能

    1.9K20

    总结 | 尹立博:Python 全局解释器锁与并发 | AI 研习社第 59 期猿桌会

    说到 GIL,就不得不提 Python 线程模型,它的运行方式如下: CPython 使用 OS 原生线程,由 OS 负责调度; 每个解释器进程唯一的主线程和用户定义的任意数量子线程; GIL 是字节码层面上的互斥锁...多核则是 2005-2006 年前后才普及,此外,GIL 的优势还包括: 简化解释器实现; 优化单进程性能; 简化 C 扩展库的整合。...这可以 C 源代码中使用 Py_BEGIN_ALLOW_THREADS / Py_END_ALLOW_THREADS 宏实现 这种多任务方式能够提升代码性能!...这是很多 Python 用户十分期待的事情,但是短期内是不太可能实现的,它的难点包括: 第一,技术问题 Guido 要求不降低单线程执行效率 兼容现有引用计数与垃圾回收机制 兼容现有 C 扩展 第二,...它是 Dask 异构集群上的扩展。它的网络结构遵循客户 – 调度器 – 工作节点这样的形式,因此要求所有节点拥有相同的 Python 运行环境。

    83120

    Python之父:明年让Python快2倍

    但在此之前,Guido可并不认为提升CPython的速度多关键,因为“其他方法可以获得更好的性能”,比如JIT编译的PyPy,或使用C语言编写扩展。 为什么要加速? Python真的慢?...所以,Python性能提升的源头来自于这些C扩展模块。而CPython又有着超过400k的loc,这意味着要从底层去做优化是一项非常庞大的工程。...Python的5倍速之路 按照已在GitHub上发布的faster-cpython,Shannon计划具体分为四个阶段: Python 3.10 预计今年10月发布,主要添加一个自适应、专业化的解释器...Python 3.13 同样代码运行时对扩展区域进行编译,增强编译器,以完成5倍的超级加速。...微软回馈Python 其实,微软长期以来一直以多种方式为Python项目提供助力,包括Azure云AI服务教程里发布免费的Python课程,以及通过VS Code Python扩展Win10及以上版本支持

    54960

    Node Sass 弃用,以 Dart Sass 代替

    那么为什么会有这次改动呢? 之后 Node Sass 还维护? Dart Sass 能满足我们的需求? Dart Sass 的性能如何? Dart Sass 带来的好处和坏处。...多年来,LibSass 显然没有足够的工程带宽来跟上 Sass 语言的最新发展 (例如,最近的语言特性是 2018 年 11 月添加的)。...可移植性和性能呢 LibSass 与 DartSass 相比两个主要优点: 可移植性:由于它是用 C++ 编写的,因此可以轻松地将 LibSass 嵌入其他编程语言中并提供原生(native-feeling...性能:通过 C++ API 调用 LibSass 与使用脚本语言直接编写代码的速度相比非常快。... JS 版本比独立的可执行文件慢,但易于集成到现有工作流程中,并且允许你 JavaScript 中定义自定义函数和导入器。

    3.6K10

    Python使用C语言程序(Windows平台)

    前言 机器学习中,很多时候我们需要PythonC的混合编程,最重要的原因是为了性能效率的提升: 解释型语言一般比编译型语言慢,一般提高性能的有效做法是,先做性能测试,找出性能瓶颈部分,然后把瓶颈部分在扩展中实现...本文的目标是windows平台下(使用pycharm),实现python调用C语言编写的程序。...) 混合编程:用 C 语言来扩展 Python 大法吧!...要使用python使用c语言编写的程序,大致分成两种方法,一种是手写,一种是用第三方的接口工具。本文将分成两部分分别讲述。...01 手写调用c语言 1、编写和调试C语言程序 windows下编写c语言面临一个选择编译器的问题,不像linux一样可以直接选用gcc。

    2.7K40

    备战秋招-面经篇-

    ,为什么选这些数据 数据集为什么这样处理 用了什么模型,模型是怎么建立的,激活函数用什么,为什么 模型性能如何,如何证明 模型用什么平台完成的 python水平怎么样,除了机器学习还用python做过什么...PR项目: 芯片面积,门数,多少层金属 电源是怎么做的 CTS怎么做的,评价CTS哪些指标 skew设置了多少,为什么 Clock latency过大有哪些坏处 做过PV 修过hold,怎么修的...place之前做了哪些处理,为什么这样做 插入了哪些physical cell,为什么 cts是怎么做的,评估指标有哪些 Cts config哪些,什么影响 用到了哪些view 7nm工艺哪些特点...怎么做的,为什么 如何在route之前做调整,避免route后发生short 有没有什么高效的方法批量解决上面的问题 STA时如何fix setup 机器学习项目 毕设还未完成的部分你打算怎么做 你要提取哪些参数...项目相关问题 了解大疆芯片,介绍一下 如果华为寒武纪英伟达大疆都给你offer选哪个,为什么 选择产品公司相对芯片公司哪些好处 晶晨 后端PR 34分钟,电话 介绍项目 项目中遇到的困难是什么

    63510

    笨办法学 Python3 第五版(预览)(一)

    我们可以写 x=100 而不是 x = 100? 可以,但这是不好的形式。你应该在操作符周围添加空格,这样更容易阅读。 “反向阅读文件(代码)”是什么意思? 非常简单。...我可以使用单引号或双引号来创建一个字符串?它们不同的作用 Python 中,用任何一种方式创建字符串都是可以接受的,尽管通常你会在像'a'或'snow'这样的短字符串中使用单引号。...学习扩展 重复来自练习 7 的学习扩展。 常见学生问题 为什么我在三个双引号之间放空格时会出错? 你必须像这样输入"""而不是" " ", 意思是每个之间都没有空格。...想象一下,你一个使用双引号的字符串,而你想在字符串中放一个双引号。如果你写"我 "理解" 乔。",那么 Python 会感到困惑,因为它会认为""理解"周围实际上结束了字符串。...代码描述 第1行,我们一个称为“import”的东西。这是你从 Python 功能集中添加功能到你的脚本的方式。Python 不会一次性给你所有功能,而是要求你说出你打算使用的功能。

    21810

    你知道终端执行 Python 代码的方式?

    2、通过 -c 指定的字符串如果你只需要快速地检查某些内容,则可以命令行中将代码作为字符串传递。...它会为你生成__main__.py并添加一条组织行(shebang line),因此你甚至不需要指定 python,如果你不想在 UNIX 上指定它的话。...如果你想移动一堆 Python 代码,这是一种不错的方法。 不幸的是,仅当压缩文件包含的所有代码都是 Python 时,才能这样运行压缩文件。...执行压缩文件对扩展模块无效(这就是为什么 setuptools 一个 zip_safe[8]标志的原因)。...(译注:扩展模块 extension module,即 C/C++ 之类的非 Python 文件) 要加载扩展模块,Python 必须调用 dlopen()[9]函数,它要传入一个文件路径,但当该文件路径就包含在压缩文件内时

    2.4K20
    领券