一段无锁并且可以水平扩展的代码

看到一段代码,如下,开始无法理解这么写的目的,但是仔细一想便明白了作者意思。

def _store_new_measures(self, metric, data):
    tmpfile = self._get_tempfile()
    tmpfile.write(data)
    tmpfile.close()
    path = self._build_measure_path(metric.id, True)
    while True:
        try:
            os.rename(tmpfile.name, path)
            break
        except OSError as e:
            if e.errno != errno.ENOENT:
                raise
            try:
                os.mkdir(self._build_measure_path(metric.id))
            except OSError as e:
                # NOTE(jd) It's possible that another process created the
                # path just before us! In this case, good for us, let's do
                # nothing then! (see bug #1475684)
                if e.errno != errno.EEXIST:
                    raise

代码逻辑可以简单得分解成

1、移动文件,成功则返回。
2、如果失败,则创建目录。回到步骤1

背景部分还有创建的目录可能在其他进程或者线程中被创建和删除。

上面的代码写得还是比较巧妙的,没有线程锁也没有进程锁。只是尝试得去移动文件,直到移动成功。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,337评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,930评论 18 399
  • 天气凉了 会为你担心 胃没有不舒服吧 成惯性思维了 照顾好自己 虽然我自己都照顾不好自己 思念为你
    任贺韬_Alan阅读 936评论 0 0
  • 记得第一次读 《论语》是在初中的时候,那时是节选了其中的几句。觉得好难懂,心里还在捣鼓,古人说话怎么是这个样子...
    孝亲尊师阅读 3,025评论 0 0
  • 0 或许是因为我不是那种拥有“沉迷体质”的人:任何事情,包括玩乐的,一旦花太多时间,我就会觉得无聊。 唯一算沉迷过...
    悟恩说事阅读 1,631评论 7 3