7

我需要使用命名锁(例如文件锁)同步 python 线程和进程(不需要相互关联)。最好它应该是读写器锁。我已经尝试过 fcntl.flock (它具有独占锁和共享锁获取),但它没有提供所需的锁定级别 - python 的 fcntl.flock 函数是否提供文件访问的线程级锁定?

到目前为止,我的解决方案是将lockfile与 memcached(或 mmap'ed 锁定文件)一起使用。Lockfile 将同步访问,memcached 将计算读取器/写入器。

有没有更好/更快的解决方案?你知道任何已经解决这个问题的项目吗?

4

1 回答 1

2

这是一个链接http://semanchuk.com/philip/与实现 posix 和 system V 信号量的库。您可以使用其中之一。请注意,在持有信号量的进程在没有释放它的情况下死亡的情况下 - 所有其他都被卡住了。如果你害怕这一点 - 你可以使用带有 UNDO 的 System V 信号量,但它们会慢一点。此外,如果您碰巧使用 System V 共享内存原语 - 请记住它们存在于内核中并在进程终止后继续存在 - 您必须明确地将它们从系统中删除。

如果你不怕死进程和整个系统和进程的死锁是相关的 - 你可以使用 python 的信号量(它们是 posix 命名的信号量。)

您作为相关问题(fcntl)链接的页面并没有说 fcntl 不适合线程间锁定。就是说 fcntl 关心 fds。因此,只要您打开锁定文件并为每个锁定实例获取新的 fd,您就可以使用 fcntl 进行进程间和线程间锁定。

您还可以将 fcntl 用于进程间,将 python 的信号量用于线程间锁定。

最后:重新思考你的架构。锁定通常是不好的。将资源委托给一个进程,该进程将在不锁定的情况下处理它。维护起来会简单得多。相信我。

于 2012-09-16T20:57:02.877 回答