我需要将python线程和进程(不必彼此相关)与命名锁(例如文件锁)同步。最好是读写器锁定。我试过fcntl.flock(它有独占和共享锁获取)但它没有提供所需的锁定级别 - Does python's fcntl.flock function provide thread level locking of file access?
到目前为止,我的解决方案是将lockfile与memcached(或mmap' ed锁定文件)一起使用。 Lockfile将同步访问,memcached将统计读者/作者。
有没有更好/更快的解决方案?你知道哪个项目已经解决了这个问题吗?
答案 0 :(得分:2)
这是一个链接http://semanchuk.com/philip/,其中包含实现posix和system V信号量的库。你可以使用其中之一。请注意,在这种情况下,当持有信号量的过程在没有释放信号量的情况下死亡时 - 所有其他信息都会被卡住。如果您害怕这一点 - 您可以将系统V信号量与UNDO一起使用但速度稍慢。此外,如果您碰巧使用System V共享内存原语 - 请记住它们存在于内核中并在进程终止后保持生存 - 您必须从系统中明确删除它们。
如果你不害怕死亡进程和整个系统和进程的死锁是相关的 - 你可以使用python的信号量(它们是posix命名为信号量。)
您作为相关问题(fcntl)链接的页面并未说fcntl不适合进行线程间锁定。据说fcntl关心fds。因此,只要打开锁定文件并为每个锁定实例获取新的fd,就可以使用fcntl进行进程间和线程间锁定。
你也可以使用fcntl进行进程间处理,使用python的信号量进行线程间锁定。
最后:重新思考你的架构。锁定通常很糟糕。将资源委托给将在不锁定的情况下处理它的进程。维护起来会更加简单。相信我。