`
rubynroll
  • 浏览: 206395 次
  • 性别: Icon_minigender_1
  • 来自: Wgt
社区版块
存档分类
最新评论

A simple inter-process lock

阅读更多
Linux程序员通常喜欢用文件锁来做进程间的同步,或简单地用文件锁指示程序进程是否还健在。在ruby里面可以很简单的实现文件锁:
=begin
 file lock for inter-process sync.
 usage:
  FSLock('mylock') do
    # protected by lock,
    # do your job here ...
  end
=end 
class FSLock
  def initialize(name=nil)
    name ||= 'global'
    @fname = name + '.lock'
    if block_given?
      lock()
      yield
      unlock()
    end
  end

  def critical
    lock()
    yield() if block_given?
    unlock()
  end

  def lock
    @f = File.new(@fname, "ab")
    @f.flock(File::LOCK_EX) if @f
  end

  def unlock
    @f.close if @f
  end
end


测试代码:
if $0 == __FILE__
  unless fork
    # child process
    3.times do |i|
      FSLock.new('/tmp/myapp') do
        sleep 2   # child process sleep while holding the lock
        puts "#{Time.now.to_s}: Ping !"
      end
    end
  else
    # parent process
    sleep 0.1
    6.times do
      FSLock.new('/tmp/myapp') do   # parent process will be blocked while child holding the lock
        puts "#{Time.now.to_s}: Pong !"
      end
      sleep 0.1
    end
    Process.wait
  end
end


父子进程通过文件锁来同步,子进程持有锁后休眠2秒导致父进程企图获取锁时休眠。最后子进程不在持有锁的时候,父进程不再block。

Win32用户可以在Cygwin下运行此代码。
分享到:
评论
2 楼 rubynroll 2008-01-03  
这个只是我自己写的一个小工具而已,如有雷同,纯属偶然,呵呵~

你的lock文件和pid结合是个好办法。不过这个文件锁在程序异常退出的时候是会自动释放的(进程退出时所打开的所有文件会自动关闭)。当然我的程序没有处理异常也是不够健壮,改进后如下:

=begin
 file lock for inter-process sync.
 usage:
  FSLock('mylock') do
    # protected by lock,
    # do your job here ...
  end
=end 
class FSLock
  def initialize(name=nil)
    name ||= 'global'
    @fname = name + '.lock'
    if block_given?
      lock()
      begin
        yield
      ensure
        unlock()
      end
    end
  end

  def critical
    lock()
    begin
      yield() if block_given?
    ensure
      unlock()
    end
  end

  def lock
    @f = File.new(@fname, "ab")
    @f.flock(File::LOCK_EX) if @f
  end

  def unlock
    @f.close if @f
  end
end


测试代码:

if $0 == __FILE__
  unless fork
    # child process
    3.times do |i|
      FSLock.new('/tmp/myapp') do
        sleep 2   # child process sleep while holding the lock
        puts "#{Time.now.to_s}: Ping !"
        if i == 1
          raise "Boom !"
        end
      end
    end
  else
    # parent process
    sleep 0.1
    6.times do
      FSLock.new('/tmp/myapp') do   # parent process will be blocked while child holding the lock
        puts "#{Time.now.to_s}: Pong !"
      end
      sleep 0.1
    end
    Process.wait
  end
end

1 楼 lgn21st 2008-01-02  
原创?转贴? anyway,受教了
另外问个问题,如果block里面的代码执行中产生异常退出,导致僵尸锁文件,如何判断?
我自己用的办法是读取进程pid,然后将pid写入lock文件,如果启动新的进程,子进程时,会先查找这个lock文件,如果找到,读出pid,然后到“/proc”下面去找看有没有同名进程id,如果有则sleep,如果没有则将自己的pid写入lock文件中。

相关推荐

    SimpleITK-2.2.1-cp37-cp37m-win-amd64.whl

    SimpleITK-2.2.1-cp37-cp37m-win-amd64.whl

    simple-xml-safe-2.7.1-API文档-中文版.zip

    赠送jar包:simple-xml-safe-2.7.1.jar; 赠送原API文档:simple-xml-safe-2.7.1-javadoc.jar; 赠送源代码:simple-xml-safe-2.7.1-sources.jar; 赠送Maven依赖信息文件:simple-xml-safe-2.7.1.pom; 包含翻译后...

    simpleDemo-release.apk.1

    simpleDemo-release.apk.1

    simpleaudio-1.0.4-cp36-cp36m-win_amd64.zip

    《简单音频处理库SimpleAudio在Windows x64平台上的安装与使用详解》 在现代软件开发中,音频处理已经成为一个不可或缺的部分,无论是游戏开发、多媒体应用还是教学软件,都需要与声音进行交互。在这个背景下,...

    SimpleITK-1.2.4-cp38-cp38-win_amd64.whl.zip

    SimpleITK是一个强大的开源软件库,专为医学图像分析和处理设计。这个压缩包文件"SimpleITK-1.2.4-cp38-cp38-win_amd64.whl.zip"包含了Windows平台上AMD64架构的Python 3.8版本的SimpleITK接口。"whl"是Python的 ...

    SimpleITK-1.2.4-cp37-cp37m-win_amd64.whl.zip

    SimpleITK是一个强大的开源软件库,专为医学图像分析和处理设计。这个压缩包文件"SimpleITK-1.2.4-cp37-cp37m-win_amd64.whl.zip"包含了该库的特定版本,适用于Python 3.7(由“cp37”表示)且为64位Windows系统(由...

    simpleaudio-1.0.4-cp310-cp310-win_amd64

    simpleaudio-1.0.4-cp310-cp310-win_amd64

    sentinel-transport-simple-http-1.8.0-API文档-中文版.zip

    赠送jar包:sentinel-transport-simple-http-1.8.0.jar; 赠送原API文档:sentinel-transport-simple-http-1.8.0-javadoc.jar; 赠送源代码:sentinel-transport-simple-http-1.8.0-sources.jar; 赠送Maven依赖信息...

    simpleaudio-1.0.4-cp39-cp39-win_amd64.zip

    《简单音频处理库SimpleAudio在Windows x64平台上的安装与使用》 在信息技术日新月异的今天,音频处理已经成为许多开发项目不可或缺的一部分。SimpleAudio是一个轻量级且易于使用的Python音频处理库,它为开发者...

    simpleaudio-1.0.4-cp38-cp38-win_amd64.zip

    《简单音频处理库simpleaudio在Windows x64平台上的安装与使用详解》 在数字化的世界里,音频处理已经成为日常开发工作中的重要一环。对于Python开发者来说,有一款名为simpleaudio的库,它提供了一个简单易用的...

    SimpleITK-1.2.0-cp36-cp36m-win_amd64.whl.zip

    SimpleITK是一个开源的、跨平台的医学影像分析库,主要设计用于图像处理、分析和可视化。这个压缩包文件“SimpleITK-1.2.0-cp36-cp36m-win_amd64.whl.zip”包含了SimpleITK的特定版本,即1.2.0,适用于Python 3.6...

    simpleaudio-1.0.4-cp310-cp310-win_amd64.zip

    《简单音频处理库SimpleAudio在Windows x64平台上的安装与使用》 在信息技术日新月异的今天,音频处理已经成为许多应用中的重要一环。简单音频处理库SimpleAudio为开发者提供了一个轻量级且易用的接口,使得在...

    simple-xml-2.7.1

    《深入理解Simple-XML库:解析与应用》 在当今的软件开发中,XML(Extensible Markup Language)作为数据交换和存储的标准格式,扮演着重要的角色。为了方便开发者高效地处理XML,各种解析库应运而生,其中Simple-...

    simple-xml-safe-2.7.1.jar

    simple-xml-safe-2.7.1.jar

    simpleaudio-1.0.4-cp39-cp39-win_amd64.whl.rar

    simpleaudio是一个用于处理音频文件的Python库,该库提供了一个简单的API来进行音频播放,录制和流处理。本次提供的文件simpleaudio-1.0.4-cp39-cp39-win_amd64.whl.rar是一个安装包,其版本为1.0.4,适用于Python ...

    SimpleITK-1.2.4-cp39-cp39-win_amd64

    SimpleITK-1.2.4-cp39-cp39-win_amd64

    AppLocker - simple lock screen for iOS Application.zip

    AppLocker - simple lock screen for iOS Application.zip,AppLocker - simple lock screen for iOS Application ( Swift 4+, iOS 9.0+) Touch ID / Face ID

    Python库 | SimpleITK-2.1.1-cp36-cp36m-win_amd64.whl

    SimpleITK,全称为“Simple Image Toolkit”,是基于ITK(Insight Segmentation and Registration Toolkit)的一个简化版本。ITK是一个开源的、跨平台的图像处理库,主要用于医学图像分析。SimpleITK的出现是为了...

    simpleaudio-1.0.4-cp38-cp38-win_amd64

    simpleaudio-1.0.4-cp38-cp38-win_amd64

    SimpleITK-2.1.1.2-cp36-cp36m-win_amd64.whl

    SimpleITK-2.1.1.2-cp36-cp36m-win_amd64.whl

Global site tag (gtag.js) - Google Analytics