Python中_multiprocess模块的SemLock是什么?

在 python 官方文档里面也没有找到 SemLock 的说明,但是
在 celery 代码里面又看到 SemLock 在被使用,有人知道是怎么回事吗?


Python中_multiprocess模块的SemLock是什么?
7 回复

看名字就知道是信号量锁呀


_multiprocess模块里的SemLock是Python多进程底层实现信号量(Semaphore)和锁(Lock)的核心类。它直接包装了操作系统提供的信号量原语(比如POSIX的sem_t或Windows的semaphore对象),用于进程间的同步控制。

简单说,当你用multiprocessing.Lock()multiprocessing.Semaphore()时,背后实际创建的就是这个SemLock对象。它通过共享内存或文件映射让不同进程能访问同一个系统信号量。

注意_multiprocess.SemLock是CPython内部实现细节(在_multiprocessingC扩展模块里),通常不应该在用户代码中直接导入使用。你应该总是通过标准的multiprocessing模块来创建锁或信号量。

这里有个例子展示标准用法和底层原理:

import multiprocessing as mp
import _multiprocessing  # 仅用于演示,实际不要直接导入

def worker(lock, value):
    with lock:
        print(f"Process {mp.current_process().name} acquired lock, value: {value}")

if __name__ == "__main__":
    # 标准用法(推荐)
    lock = mp.Lock()
    
    # 查看底层对象类型
    print(type(lock))  # <class 'multiprocessing.synchronize.Lock'>
    print(type(lock._semlock))  # <class '_multiprocessing.SemLock'>
    
    # 实际使用
    processes = []
    for i in range(3):
        p = mp.Process(target=worker, args=(lock, i))
        processes.append(p)
        p.start()
    
    for p in processes:
        p.join()

关键点

  • SemLock实现了acquire()/release()等同步原语操作
  • 支持命名信号量(跨进程共享)
  • 处理了序列化、引用计数等底层细节

一句话建议:直接用multiprocessing.Lock/Semaphore就行,别碰底层的SemLock

有没有例子说明下呀

信号量没听过的话应该去查操作系统原理。

信号量不是 semaphore 这个吗 Semlock 难道等于 semaphore?

这么问不如翻番代码

multiprocessing 中的 SemLock 是用来构建 Semaphore 和 Mutex 的基类。见 Python27\Lib\multiprocessing<a target="_blank" href=“http://synchronize.py” rel=“nofollow noopener”>synchronize.py

_multiprocessing 中的 SemLock 是对应的底层实现,根据不同的系统,调用不同的系统 API。比如 Windows 下用 CreateSemaphore,Linux/Unix 下用 sem_open,用于创建系统信号量。见 Python 源码\Modules_multiprocessing\semaphore.c

说真的,你有这闲工夫发帖子,不如自己翻一下代码就什么都懂了。

回到顶部