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 相关文章推荐
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
Jan 17 Python
详解Python3.1版本带来的核心变化
Apr 07 Python
利用Python脚本实现ping百度和google的方法
Jan 24 Python
Python对象类型及其运算方法(详解)
Jul 05 Python
IntelliJ IDEA安装运行python插件方法
Dec 10 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
Jan 07 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
使用 Django Highcharts 实现数据可视化过程解析
Jul 31 Python
Python的Lambda函数用法详解
Sep 03 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
python标准库OS模块详解
Mar 10 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 和 XML: 使用expat函数(二)
2006/10/09 PHP
php学习之简单计算器实现代码
2011/06/09 PHP
简单的php缓存类分享     php缓存机制
2014/01/22 PHP
php操作mysql数据库的基本类代码
2014/02/25 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
php实现CSV文件导入和导出
2015/10/24 PHP
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
2012/09/14 Javascript
javascript用户注册提示效果的简单实例
2013/08/17 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
angularjs学习笔记之简单介绍
2015/09/26 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
微信小程序开发之数据存储 参数传递 数据缓存
2017/04/13 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
canvas轨迹回放功能实现
2017/12/20 Javascript
angularjs实现分页和搜索功能
2018/01/03 Javascript
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
Node.js安装详细步骤教程(Windows版)详解
2019/09/01 Javascript
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
Python+pandas计算数据相关系数的实例
2018/07/03 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
Python爬虫实例——爬取美团美食数据
2020/07/15 Python
python实现视频压缩功能
2020/12/18 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
2021/02/02 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
CSS3 选择器 基本选择器介绍
2012/01/21 HTML / CSS
草莓网官网:StrawberryNET
2019/08/21 全球购物
施工资料员的岗位职责
2013/12/22 职场文书
生产部厂长职位说明书
2014/03/03 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
优质服务演讲稿
2014/05/14 职场文书
Python数据分析入门之数据读取与存储
2021/05/13 Python
详细了解java监听器和过滤器
2021/07/09 Java/Android