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
相关产品推荐
相关产品推荐

