Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在进程之间传递资源锁的最佳方式_Python_Process - Fatal编程技术网

Python 在进程之间传递资源锁的最佳方式

Python 在进程之间传递资源锁的最佳方式,python,process,Python,Process,我有两个python程序,它们应该并行运行并执行相同的操作: 从磁盘读取和解压缩数据(大约需要1分钟) 过程数据(大约需要2-3分钟) 将数据发送到数据库(大约需要3-5分钟) 如您所见,以一种方式同步两个实例的执行将是很好的,一个执行处理器繁重的步骤1和2(实现是多线程的,因此CPU实际上可以最大化),而另一个执行I/O繁重的步骤3,反之亦然 我的第一个想法是使用锁文件,每个进程在进入第3阶段时都会获取锁文件,并在完成后发布。因此,另一个进程将等待锁释放,然后在进入第3阶段时进行设置。然而,这

我有两个python程序,它们应该并行运行并执行相同的操作:

  • 从磁盘读取和解压缩数据(大约需要1分钟)
  • 过程数据(大约需要2-3分钟)
  • 将数据发送到数据库(大约需要3-5分钟)
  • 如您所见,以一种方式同步两个实例的执行将是很好的,一个执行处理器繁重的步骤1和2(实现是多线程的,因此CPU实际上可以最大化),而另一个执行I/O繁重的步骤3,反之亦然

    我的第一个想法是使用锁文件,每个进程在进入第3阶段时都会获取锁文件,并在完成后发布。因此,另一个进程将等待锁释放,然后在进入第3阶段时进行设置。然而,这似乎是一种非常麻烦的方法。此外,该系统应在无人监督的情况下运行数天或数周,能够从错误、计划重新启动或电源故障中恢复。特别是在最后一种情况下,锁定文件可以简单地锁定所有内容


    有没有更优雅的方式来沟通两个进程之间的锁定?或者我应该使用lockfile并尝试实现一些智能清理功能来防止死锁发生?

    如果您在运行时遇到一些同步问题,我认为没有比使用信号量更好的方法了。处理清理和锁部件的方式在很大程度上取决于您的问题。这类问题有很多资源。Python已经实现了一些

    您可以查看此示例


    另外请注意,我从未在python上使用过它,但它在其他语言中被广泛使用。

    似乎每种解决方案都有一些缺点-某些机制或模块并非在所有平台上都可用(即仅限Linux或仅限Windows),或者使用基于文件系统的方法可能会遇到错误恢复问题(正如你在问题中已经指出的那样)

    以下是一些可能选项的列表:

    使用Python的
    多处理
    模块 这允许您创建如下所示的锁:

    lock = multiprocessing.Lock()
    
    lock.acquire() 
    # do something
    lock.release() 
    
    并且像这样获取和发布它:

    lock = multiprocessing.Lock()
    
    lock.acquire() 
    # do something
    lock.release() 
    
    一个完整的例子

    Pro:使用简单;跨平台;错误恢复没有问题

    Con:由于您当前有两个独立的程序,因此必须重新排列代码,以便从同一个python模块启动两个进程

    使用
    fnctl
    (Linux) 对于Linux/Unix系统,有(带有
    fcntl.flock()
    )作为python模块提供。这是基于锁文件的

    另请参见我在此重复的一些建议:

    • 将锁定进程的进程ID写入文件,以便能够识别和修复可能的死锁
    • 将锁定文件放在临时位置或RAM文件系统中
    Con:不跨平台,仅在Linux/Unix系统上可用

    使用posix_ipc(Linux) 对于Linux/Unix系统,有一个python模块(带有
    信号量
    类)

    Pro:不基于文件系统,错误恢复没有问题

    Con:不跨平台,仅在Linux/Unix系统上可用

    使用
    msvcrt
    (Windows) 对于Windows系统,有(带有
    msvcrt.locking()
    )作为python模块提供

    另见

    缺点:不跨平台,仅在Windows系统上可用

    使用第三方库 您可能希望查看以下python库:

    谢谢,“文件锁”-库似乎正是我想要的。但是,我必须找出我必须在哪里进行锁检查,以便它对性能的影响最小。。。