Python使用functools实现注解同步方法


Posted in Python onFebruary 06, 2018

在 Python 中没有类似 Java 中使用的 synchronized 关键字来同步方法,因此在 Python 中要实现同步方法,通常我们是使用 threading.Lock() 来实现。在进入函数的地方获取锁,出函数的时候释放锁,这样实现代码看起好非常不好看。另外网上也有人给出了其它几种实现方式,但看起来都不美气。

今天我在做项目的时候突然想到是不是可以通过 functools 来实现通过注解来标注方法为同步方法。

首先要求自己的类中有一个锁对象并且在类初始化的时候初始化这个锁对象,比如:

class MyWorker(object):
  def __init__(self):
    self.lock = threading.Lock()
    ...
  ...

然后创建一个 synchronized 函数,这个函数装饰具体对象的具体方法,将方法放到获取/释放锁之间来运行,如下

def synchronized(func):
  @functools.wraps(func)
  def wrapper(self, *args, **kwargs):
    with self.lock:
      return func(self, *args, **kwargs)
  return wrapper

最后在需要使用同步的方法上使用 @synchronized 来标准方法是同步方法,比如:

@synchronized
def test(self):
  ...

下面是一个完整例子,仅供参考:

import threading
import functools
import time
def synchronized(func):
  @functools.wraps(func)
  def wrapper(self, *args, **kwargs):
    with self.lock:
      return func(self, *args, **kwargs)
  return wrapper
class MyWorker(object):
  def __init__(self):
    self.lock = threading.Lock()
    self.idx = 0
  @synchronized
  def test1(self):
    for i in range(1, 11):
      self.idx = self.idx + 1
      print "Test1: " + str(self.idx)
      time.sleep(1)
  @synchronized
  def test2(self):
    for i in range(1, 11):
      self.idx = self.idx + 1
      print "Test2: " + str(self.idx)
      time.sleep(1)
  @synchronized
  def test3(self):
    for i in range(1, 11):
      self.idx = self.idx + 1
      print "Test3: " + str(self.idx)
      time.sleep(1)
worker = MyWorker()
threading.Thread(target=worker.test1).start()
threading.Thread(target=worker.test2).start()
threading.Thread(target=worker.test3).start()

总结

以上所述是小编给大家介绍的Python使用functools实现注解同步方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python和Java进行DES加密和解密的实例
Jan 09 Python
使用Python进行AES加密和解密的示例代码
Feb 02 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
详解django中使用定时任务的方法
Sep 27 Python
Django处理Ajax发送的Get请求代码详解
Jul 29 Python
python代码实现逻辑回归logistic原理
Aug 07 Python
Python实现自定义读写分离代码实例
Nov 16 Python
pymysql的简单封装代码实例
Jan 08 Python
python如何提取英语pdf内容并翻译
Mar 03 Python
Python下载网易云歌单歌曲的示例代码
Aug 12 Python
python 怎样进行内存管理
Nov 10 Python
OpenCV+python实现膨胀和腐蚀的示例
Dec 21 Python
django中send_mail功能实现详解
Feb 06 #Python
Python打印“菱形”星号代码方法
Feb 05 #Python
Django权限机制实现代码详解
Feb 05 #Python
Django中的Signal代码详解
Feb 05 #Python
Python实现XML文件解析的示例代码
Feb 05 #Python
Python下载网络文本数据到本地内存的四种实现方法示例
Feb 05 #Python
Python实现屏幕截图的两种方式
Feb 05 #Python
You might like
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
PHP令牌 Token改进版
2008/07/18 PHP
PHP 缓存实现代码及详细注释
2010/05/16 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
Flexigrid在IE下不显示数据的有效处理方法
2014/09/04 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
Vue的watch和computed方法的使用及区别介绍
2018/09/06 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
JavaScript根据json生成html表格的示例代码
2018/10/24 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
[32:36]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第二场 12.12
2020/12/16 DOTA
Python进阶-函数默认参数(详解)
2017/05/18 Python
Python Nose框架编写测试用例方法
2017/10/26 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
2018/04/10 Python
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
python读取txt文件中特定位置字符的方法
2018/12/24 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
高清屏下canvas重置尺寸引发的问题的解决
2019/10/14 HTML / CSS
波兰家具和室内装饰品购物网站:Vivre
2018/04/10 全球购物
什么是serialVersionUID
2016/03/04 面试题
META-INF文件夹中的MANIFEST.MF的作用
2016/06/21 面试题
服装行业创业计划书范文
2014/02/05 职场文书
《临死前的严监生》教学反思
2014/02/13 职场文书
2014年乡镇工会工作总结
2014/12/02 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
教师年度考核自我评鉴
2015/08/11 职场文书
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers