在单独的 python 脚本中'Critical Resource'以防止竞争情况



我对多处理非常陌生,并希望创建一个python脚本,以便任何人都可以SSH到我的Rpi并使用gpio,但唯一的条件是,当一个用户访问一个函数时,其他用户必须等待'x'秒(直到函数完成执行)才能启用同步。为了测试这一点,我在我的pc上创建了两个测试文件,希望能为你提供更好的想法:-文件1

def main1(input2, input1, num, val, lock):
with lock:
print(input2)
print(input1)
time.sleep(int(input1))
val.value = val.value + 1

def main3(input2, input1, d, val, lock):
t1 = multiprocessing.Process(target=main1, args=(input2, input1, d, val, lock, ))
t1.start()
t1.join()
print(val.value)

文件2:

if __name__ == '__main__':   

lock = multiprocessing.Lock()
val = multiprocessing.Value('i', int(1))
while True:
input3 = input('enter on')
if input3 == 'on':


relno = int(input('enter relay to turn on [1-7]: '))
d = 0
test.main3(input3, relno, d, val, lock)

elif input3 == 'off':
relno = int(input('enter relay to turn on [1-7]: '))
d = 0
test.main3(input3, relno, d, val, lock)


else:
print("not working")
break
print(val.value)

我的任何文件都没有得到任何错误。唯一的问题是,当我使用两个终端并行地发出命令时,我的关键资源是不安全的,并且被两个进程(不同的pid)同时访问。

我希望你可能知道我正在努力实现的目标,任何建议都是有帮助的。谢谢。

如果我理解正确的话,您是在两个不同的终端呼叫python file2.py吗?在本例中,您有一个主进程(file2.py)的完全独立的实例,每个实例都有自己的子进程(file1.main1),每个实例都有一个单独的mp.Value()。您的流程无法相互了解或了解其他"共享"的流程。价值。这些类型的共享值只能与子进程共享。如果两个进程之间没有关系,则必须使用另一种机制来共享信息。有几种方法可以做到这一点,但它们都归结为操作系统管理一些所有进程共用的资源。

首先,文件系统对所有进程都是通用的,因此您可以使用filelock之类的东西来控制对中继的访问。文件系统也在multiprocessing.shared_memory后面,它可以被赋予一个固定的文件名,允许跨不相关进程的通信(尽管它不提供与Lock类似的简单模拟,但它可以很容易地用于数据传输)。

其次,你可以在一个固定的端口上托管一个服务器,该端口控制对中继和"客户端"的访问。只需连接到该端口(该端口只能对本地主机开放,或者您甚至可以允许外部连接以避免需要SSH)。这样,只有一个进程可以控制你的"关键资源"。

第三,因为您提到了RPI,您可以安装posix_ipc,它允许您创建命名的锁、队列和共享内存区域。这与内置的multiprocessing.shared_memory非常相似,因为您可以在单独的文件中通过名称引用相同的锁,但增加了操作系统本地锁和队列(不是常规的python队列,它们只能发送字符串)。

相关内容

  • 没有找到相关文章

最新更新