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中使用sort()方法进行排序的简单教程
May 21 Python
深入理解Python中字典的键的使用
Aug 19 Python
Python实现感知器模型、两层神经网络
Dec 19 Python
Python 元类实例解析
Apr 04 Python
用python编写第一个IDA插件的实例
May 29 Python
python opencv实现切变换 不裁减图片
Jul 26 Python
Python画图实现同一结点多个柱状图的示例
Jul 07 Python
Python Pandas数据中对时间的操作
Jul 30 Python
使用python脚本自动创建pip.ini配置文件代码实例
Sep 20 Python
python 双循环遍历list 变量判断代码
May 04 Python
Python3 requests模块如何模仿浏览器及代理
Jun 15 Python
python利用文件时间批量重命名照片和视频
Feb 09 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
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
PHP实现的函数重载功能示例
2018/08/03 PHP
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
js获取ip和地区
2017/03/10 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
手写Vue2.0 数据劫持的示例
2021/03/04 Vue.js
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
python如何读写csv数据
2018/03/21 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
Python多继承原理与用法示例
2018/08/23 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
Python 必须了解的5种高级特征
2020/09/10 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
HTML5 canvas画图并保存成图片的jcanvas插件
2014/01/17 HTML / CSS
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
Burt’s Bees英国官网:世界领先的天然个人护理品牌
2020/08/17 全球购物
如何打造一封优秀的留学推荐信
2014/01/25 职场文书
计算机专业毕业生求职信
2014/04/30 职场文书
技术比武方案
2014/05/19 职场文书
党员自我评议对照检查材料
2014/09/27 职场文书
应届毕业生自荐信
2015/03/04 职场文书
表扬信格式模板
2015/05/05 职场文书
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL
海贼王十大逆天果实 魂魂果实上榜,岩浆果实攻击力最强
2022/03/18 日漫
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS