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批量修改文件名的实现代码
Sep 01 Python
Python迭代用法实例教程
Sep 08 Python
使用python遍历指定城市的一周气温
Mar 31 Python
Python实现对文件进行单词划分并去重排序操作示例
Jul 10 Python
Python实现定时自动关闭的tkinter窗口方法
Feb 16 Python
详解python函数的闭包问题(内部函数与外部函数详述)
May 17 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
节日快乐! Python画一棵圣诞树送给你
Dec 24 Python
Python Print实现在输出中插入变量的例子
Dec 25 Python
详解Python的三种拷贝方式
Feb 11 Python
Python函数递归调用实现原理实例解析
Aug 11 Python
Python3 用matplotlib绘制sigmoid函数的案例
Dec 11 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读取excel文件的简单实例
2013/08/26 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
小试JQuery的AutoComplete插件
2011/05/04 Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
javascript 事件处理程序介绍
2012/06/27 Javascript
JS获取并操作iframe中元素的方法
2013/03/21 Javascript
JavaScript包装对象使用介绍
2013/08/29 Javascript
图片翻转效果具体实现代码
2014/01/09 Javascript
对 jQuery 中 data 方法的误解分析
2014/06/18 Javascript
JavaScript缓冲运动实现方法(2则示例)
2016/01/08 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
js时间查询插件使用详解
2017/04/07 Javascript
详解AngularJS脏检查机制及$timeout的妙用
2017/06/19 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
koa2 数据api中间件设计模型的实现方法
2020/07/13 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
解决vuex刷新数据消失问题
2020/11/12 Javascript
[01:14]DOTA2亚洲邀请赛小组赛赛前花絮
2017/03/27 DOTA
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
Python实现Linux中的du命令
2017/06/12 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
python能做什么 python的含义
2019/10/12 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
基于matplotlib xticks用法详解
2020/04/16 Python
德国低价购买灯具和家具网站:Style-home.de
2016/11/25 全球购物
英国最大的线上保健品零售商之一:Vitamin Planet
2016/12/01 全球购物
巴基斯坦购物网站:Goto
2019/03/11 全球购物
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
英语专业毕业个人求职自荐信
2013/09/21 职场文书
官僚主义现象查摆问题整改措施
2014/10/04 职场文书
员工辞职信范文
2015/03/02 职场文书
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技