You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多进程模块能否实现非关联进程间的信号量同步?

跨独立Python进程的FPGA资源同步方案

一、multiprocessing模块能否实现无共同父进程的进程间同步?

可以。Python的multiprocessing模块支持系统级命名同步原语,和Linux命名信号量的作用完全等效,无需进程间有共同父进程关联。

二、具体实现方式

1. 使用multiprocessing命名互斥锁(Lock)

适用于互斥访问场景(和C中初始值为1的命名信号量一致),支持跨独立进程、进程内多线程同步:

进程1(守护进程/命令行启动)代码:

from multiprocessing import Lock

# 通过唯一系统级名称创建/获取锁
fpga_lock = Lock(name="/fpga_hardware_sync_lock")

def access_fpga():
    with fpga_lock:
        # 第一步:将FPGA恢复至空闲状态
        # ... 硬件复位/状态恢复代码 ...
        # 第二步:原子访问硬件资源
        # ... FPGA操作代码 ...

# 多线程场景下,直接在线程中调用access_fpga即可
import threading
threading.Thread(target=access_fpga).start()

进程2(完全独立的另一个Python进程)代码:

from multiprocessing import Lock

# 使用完全相同的名称获取同一把锁
fpga_lock = Lock(name="/fpga_hardware_sync_lock")

with fpga_lock:
    # 同样先恢复FPGA至空闲状态,再执行操作
    # ... 硬件操作代码 ...

关键说明:

  • 锁名称必须以/开头,是系统全局唯一标识;
  • 锁是系统级资源,进程退出后不会自动销毁,若不再需要可调用fpga_lock.unlink()删除;
  • 同一进程内的多线程可直接复用该锁对象,无需额外处理,线程间同步自动生效。

2. 使用multiprocessing命名信号量(Semaphore)

如果需要支持多进程并发访问(比如允许N个进程同时操作),可使用命名信号量:

from multiprocessing import Semaphore

# 创建初始值为2的命名信号量,允许2个进程同时访问
fpga_sem = Semaphore(value=2, name="/fpga_hardware_sem")

with fpga_sem:
    # 先恢复FPGA空闲状态,再执行操作
    # ... 硬件操作代码 ...

三、替代方案(当multiprocessing命名原语不满足需求时)

如果需要和C语言的命名信号量完全兼容,或需要更底层的控制,可通过ctypes直接调用Linux系统API:

import ctypes
libc = ctypes.cdll.LoadLibrary("libc.so.6")

# 定义系统调用参数
SEM_O_CREAT = 0o1000
SEM_O_EXCL = 0o2000
# 创建/打开初始值为1的命名信号量
sem = libc.sem_open(b"/fpga_c_compat_sem", SEM_O_CREAT, 0o666, 1)

# 申请信号量
libc.sem_wait(sem)
try:
    # 恢复FPGA空闲状态 + 硬件操作
    # ... 代码 ...
finally:
    # 释放信号量
    libc.sem_post(sem)

# 关闭信号量(进程退出时自动关闭,显式关闭更安全)
libc.sem_close(sem)

内容的提问来源于stack exchange,提问作者user1159290

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:30:29