Linux上的Perl flock:如果许多进程等待打开一个锁定的文件怎么办?
如果许多进程在释放一个独占锁定的文件时等待打开该文件,会发生什么情况 我希望只有一个进程需要打开才能成功地再次打开文件,但事实似乎并非如此 我确实阅读了linuxLinux上的Perl flock:如果许多进程等待打开一个锁定的文件怎么办?,linux,perl,locking,Linux,Perl,Locking,如果许多进程在释放一个独占锁定的文件时等待打开该文件,会发生什么情况 我希望只有一个进程需要打开才能成功地再次打开文件,但事实似乎并非如此 我确实阅读了linuxflock系统调用(以及Perl的flock()函数)的文档,但我找不到任何关于该用例的内容 这是我的详细用例: 一些CGI perl进程调用局域网上的一个中央服务,这相当繁重和缓慢,如果一次由一个客户机调用,性能会更好。CGI请求可能很多(比如50~60个)并且是并发的,因此我使用flock机制作为信号量,让CGI进程在调用中央服务之
flock
系统调用(以及Perl的flock()
函数)的文档,但我找不到任何关于该用例的内容
这是我的详细用例:一些CGI perl进程调用局域网上的一个中央服务,这相当繁重和缓慢,如果一次由一个客户机调用,性能会更好。CGI请求可能很多(比如50~60个)并且是并发的,因此我使用
flock
机制作为信号量,让CGI进程在调用中央服务之前等待,一次一个
这是我用来实现信号量的(简化)代码:
open($LOCK, "+>" . "/tmp/semaphore.lock") or die("Can't open semaphore ($!)");
flock($LOCK, LOCK_EX) or die ("Can't lock semaphore ($!)");
# <CALL THE SLOW SERVICE>
flock($LOCK, LOCK_UN) or die("Can't unlock semaphore ($!)");
close($LOCK);
但是,我观察到的流程是:
CGI process A opens semaphore
CGI process A locks semaphore
CGI process A calls service
CGI process B opens semaphore
CGI process C opens semaphore
CGI process D opens semaphore
CGI process A unlocks semaphore
CGI process B locks semaphore
CGI process B calls service
CGI process C locks semaphore (!)
CGI process C calls service (!)
CGI process D locks semaphore (!)
CGI process D calls service (!)
CGI process B unlocks semaphore
...
答案(如果可能的话)应该优先考虑对当前代码进行尽可能少的修改的解决方案,因为它已经投入生产相当长的时间了,所以:更改越少越好…:-) 在任何给定时间,只有一个进程可以持有独占锁 因此,以下情况之一对您来说应该是正确的:
- 要锁定的文件位于NFS设备上<代码>群集不支持这些
- 您描述的对
的调用发生在同一进程中<代码>群集不能用于排除同一进程的线程flock
- 锁被打开了。请记住,解锁可能发生在分叉过程中
CGI process A opens semaphore
CGI process A locks semaphore
CGI process A calls service
CGI process B opens semaphore
CGI process C opens semaphore
CGI process D opens semaphore
CGI process A unlocks semaphore
CGI process B locks semaphore
CGI process B calls service
CGI process C locks semaphore (!)
CGI process C calls service (!)
CGI process D locks semaphore (!)
CGI process D calls service (!)
CGI process B unlocks semaphore
...