ITPub博客

首页 > 应用开发 > Python > Python内存屏障的使用

Python内存屏障的使用

原创 Python 作者:raptors 时间:2025-11-12 16:20:57 0 删除 编辑

# Python内存屏障的使用


在Python中,内存屏障(Memory Barrier)的概念主要与多线程编程和底层并发控制相关。Python通过几种机制提供了内存屏障功能:


## 1. `threading` 模块中的屏障


Python 3.2+ 在 `threading` 模块中直接提供了 `Barrier` 类,这是一种同步原语,允许多个线程等待直到所有线程都到达某个点再继续执行。


```python

import threading


def worker(barrier):

    print(f"Thread {threading.get_ident()} waiting at barrier")

    barrier.wait()

    print(f"Thread {threading.get_ident()} passed the barrier")


# 创建允许3个线程的屏障

barrier = threading.Barrier(3)


threads = [threading.Thread(target=worker, args=(barrier,)) for _ in range(3)]

for t in threads:

    t.start()

for t in threads:

    t.join()

```


## 2. 底层内存屏障


对于需要更底层控制的场景(如使用 `ctypes` 或与C扩展交互时),Python通过以下方式提供内存屏障:


### a. `sys.getswitchinterval()` 和 `sys.setswitchinterval()`


这些函数控制线程切换间隔,间接影响内存可见性。


### b. `_thread` 模块


提供底层线程原语,但一般不直接暴露内存屏障。


## 3. 通过锁实现内存屏障效果


Python的标准锁(`threading.Lock` 和 `threading.RLock`)在获取和释放时会隐式创建内存屏障,确保内存操作的可见性:


```python

import threading


shared_data = 0

lock = threading.Lock()


def increment():

    global shared_data

    for _ in range(100000):

        with lock:  # 获取和释放锁创建内存屏障

            shared_data += 1

```


## 4. `multiprocessing` 中的屏障


类似于线程屏障,进程间也有屏障实现:


```python

from multiprocessing import Barrier, Process


def worker(barrier):

    print(f"Process {barrier.parties} waiting at barrier")

    barriere.wait()

https://zq.zhaopin.com/moment/71141356

https://zq.zhaopin.com/moment/71141229

https://zq.zhaopin.com/moment/71141068

https://zq.zhaopin.com/moment/71141064

https://zq.zhaopin.com/moment/71141040

https://zq.zhaopin.com/moment/71141015

https://zq.zhaopin.com/moment/71141012

https://zq.zhaopin.com/moment/71141008

https://zq.zhaopin.com/moment/71140475

https://zq.zhaopin.com/moment/71140197

https://zq.zhaopin.com/moment/71140127

https://zq.zhaopin.com/moment/71140079

https://zq.zhaopin.com/moment/71140003

https://zq.zhaopin.com/moment/71139730

https://zq.zhaopin.com/moment/71139681

https://zq.zhaopin.com/moment/71139544

https://zq.zhaopin.com/moment/71139197

https://zq.zhaopin.com/moment/71139130



    print(f"Process passed the barrier")


if __name__ == '__main__':

    barrier = Barrier(3)

    processes = [Process(target=worker, args=(barrier,)) for _ in range(3)]

    for p in processes:

        p.start()

    for p in processes:

        p.join()

```


## 注意事项


1. Python的GIL(全局解释器锁)已经提供了基本的内存可见性保证

2. 大多数情况下,使用高级同步原语(如锁、事件、条件变量)比直接处理内存屏障更安全

3. 只有在与C扩展交互或进行极低层编程时才需要考虑显式内存屏障


对于绝大多数Python应用,使用标准库提供的同步机制就足够了,不需要直接处理内存屏障。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/34366/viewspace-3101108/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-29

  • 博文量
    20
  • 访问量
    20448