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超简单解决约瑟夫环问题
May 12 Python
深入理解NumPy简明教程---数组1
Dec 17 Python
Python使用plotly绘制数据图表的方法
Jul 18 Python
selenium + python 获取table数据的示例讲解
Oct 13 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
Oct 18 Python
python广度优先搜索得到两点间最短路径
Jan 17 Python
Django uwsgi Nginx 的生产环境部署详解
Feb 02 Python
Python 装饰器原理、定义与用法详解
Dec 07 Python
使用Puppeteer爬取微信文章的实现
Feb 11 Python
opencv 图像礼帽和图像黑帽的实现
Jul 07 Python
python中zip()函数遍历多个列表方法
Feb 18 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 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
深入extjs与php参数交互的详解
2013/06/25 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
Extjs显示从数据库取出时间转换JSON后的出现问题
2012/11/20 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
浅析jQuery Ajax通用js封装
2016/06/22 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
2017/04/11 jQuery
详解使用nvm安装node.js
2017/07/18 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
2020/05/10 Javascript
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
Python中异常重试的解决方案详解
2017/05/05 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
python复制列表时[:]和[::]之间有什么区别
2018/10/16 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
浅析Python3 pip换源问题
2020/01/06 Python
用python制作个视频下载器
2021/02/01 Python
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
Troy-Bilt官网:草坪割草机、吹雪机、分蘖机等
2019/02/19 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
银行见习期自我鉴定
2014/01/29 职场文书
珠宝的促销活动方案
2014/08/31 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
汇报材料怎么写
2014/12/30 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
2015年社区消防安全工作总结
2015/10/14 职场文书
React 高阶组件HOC用法归纳
2021/06/13 Javascript
MySQL数据库查询之多表查询总结
2022/08/05 MySQL
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers