Python简单进程锁代码实例


Posted in Python onApril 27, 2015

先说说线程

在多线程中,为了保证共享资源的正确性,我们常常会用到线程同步技术.
将一些敏感操作变成原子操作,保证同一时刻多个线程中只有一个线程在执行这个原子操作。
我最常用的是互斥锁,也称独占锁。其次还有读写锁,信号量,条件变量等。
除此之外,我们在进程间通信时会用到信号,向某一个进程发送信号,该进程中设置信号处理函数,然后当该进程收到信号时,执行某些操作。
其实在线程中,也可以接受信号,利用这种机制,我们也可以用来实现线程同步。更多信息见 https://3water.com/article/64977.htm

再说说进程

进程里我们通过一些进程间通信方式,可以实现进程间的同步。
最近我遇到的一个情况是,某采集系统进程池中很多进程会向同一个日志文件中打印日志,如果通过进程间通信实现,比较麻烦。
还有一种办法,如果采用共享内存的方式,不同的进程分别将日志消息通过共享内存放入一个线程安全的队列中,再建立一个进程负责专门打印日志,这样也可以保证不被大乱,
保证日志的正确性,但代码量也很多阿。
还有一种办法,在共享内存中设置一个互斥锁,所有进程共享。
如果能像线程一样,有一个简单的互斥锁,用的时候只要加锁,就能实现进程间的互斥就好了。之前对文件加锁,也有些印象,于是我用它实现了一个进程间的互斥锁

#coding=utf-8 
 
""" 
Process mutex lock. 
Actually it is implemented by file lock. 
""" 
 
import fcntl 
 
class ProcessLock(object): 
 
    __lockfd = None 
 
    @staticmethod 
    def lock(): 
        ProcessLock.__lockfd = open(__file__, 'a+') 
        fcntl.flock(ProcessLock.__lockfd, fcntl.LOCK_EX) 
 
    @staticmethod 
    def unlock(): 
        fcntl.flock(ProcessLock.__lockfd, fcntl.LOCK_UN)

加锁  ProcessLock.lock()
释放 ProcessLock.unlock()
非常简单使用,有兴趣的朋友可以试一试。

Python 相关文章推荐
python计算对角线有理函数插值的方法
May 07 Python
Django中使用locals()函数的技巧
Jul 16 Python
Python面向对象class类属性及子类用法分析
Feb 02 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
Apr 21 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
May 30 Python
python 将字符串完成特定的向右移动方法
Jun 11 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
解决tensorflow打印tensor有省略号的问题
Feb 04 Python
Tensorflow 多线程与多进程数据加载实例
Feb 05 Python
解决Python pip 自动更新升级失败的问题
Feb 21 Python
python中lower函数实现方法及用法讲解
Dec 23 Python
在Python中使用列表生成式的教程
Apr 27 #Python
讲解Python中的递归函数
Apr 27 #Python
理解Python中函数的参数
Apr 27 #Python
Python中自定义函数的教程
Apr 27 #Python
在Python中使用dict和set方法的教程
Apr 27 #Python
在Python中使用判断语句和循环的教程
Apr 25 #Python
详解Python中列表和元祖的使用方法
Apr 25 #Python
You might like
用PHP ob_start()控制浏览器cache、生成html实现代码
2010/02/16 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
php查找指定目录下指定大小文件的方法
2014/11/28 PHP
Zend Framework处理Json数据方法详解
2016/12/09 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
动态刷新 dorado树的js代码
2009/06/12 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
javascript中创建对象的几种方法总结
2013/11/01 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
2015/12/28 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
Java遍历集合方法分析(实现原理、算法性能、适用场合)
2016/04/25 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
js实现单张图片平移切换效果
2017/10/11 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
Python入门篇之条件、循环
2014/10/17 Python
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
英国音乐设备和乐器商店:Gear4music
2017/10/16 全球购物
中学老师的自我评价
2013/11/07 职场文书
机关单位人员学雷锋心得体会
2014/03/10 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
谢师宴答谢词
2015/01/05 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
互联网的下一个风口:新的独角兽将诞生
2019/08/02 职场文书
python之django路由和视图案例教程
2021/07/26 Python
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS
TypeScript 内置高级类型编程示例
2022/09/23 Javascript