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 文件重命名工具代码
Jul 26 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
May 25 Python
对Python中type打开文件的方式介绍
Apr 28 Python
浅谈Python中重载isinstance继承关系的问题
May 04 Python
python实现俄罗斯方块游戏
Mar 25 Python
Python实现基于PIL和tesseract的验证码识别功能示例
Jul 11 Python
Python多继承原理与用法示例
Aug 23 Python
python获取中文字符串长度的方法
Nov 14 Python
python使用xlsxwriter实现有向无环图到Excel的转换
Dec 12 Python
人工神经网络算法知识点总结
Jun 11 Python
Pytorch中TensorBoard及torchsummary的使用详解
May 12 Python
python读取并查看npz/npy文件数据以及数据显示方法
Apr 14 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
PHP面向对象分析设计的61条军规小结
2010/07/17 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
关于javascript function对象那些迷惑分析
2011/10/24 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
JavaScript中的console.trace()函数介绍
2014/12/29 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
AngularJS监听ng-repeat渲染完成的方法
2018/03/20 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
Javascript实现购物车功能的详细代码
2018/05/08 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
vue实现抽屉弹窗效果
2020/11/15 Javascript
python动态加载包的方法小结
2016/04/18 Python
apache部署python程序出现503错误的解决方法
2017/07/24 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
2017/09/24 Python
python读取中文txt文本的方法
2018/04/12 Python
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
python+os根据文件名自动生成文本
2019/03/21 Python
python实现本地批量ping多个IP的方法示例
2019/08/07 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
2020/04/08 Python
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
高一新生军训方案
2014/05/12 职场文书
培训简讯范文
2015/07/20 职场文书
2016寒假假期总结
2015/10/10 职场文书
HTML页面滚动时部分内容位置固定不滚动的实现
2021/04/14 HTML / CSS
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL