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函数缺省值与引用学习笔记分享
Feb 10 Python
朴素贝叶斯算法的python实现方法
Nov 18 Python
Linux下编译安装MySQL-Python教程
Feb 02 Python
Python编写登陆接口的方法
Jul 10 Python
Python安装Numpy和matplotlib的方法(推荐)
Nov 02 Python
对python生成业务报表的实例详解
Feb 03 Python
Python3爬楼梯算法示例
Mar 04 Python
OpenCV-Python 摄像头实时检测人脸代码实例
Apr 30 Python
Python实现计算对象的内存大小示例
Jul 10 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
python list多级排序知识点总结
Oct 23 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 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
一个SQL管理员的web接口
2006/10/09 PHP
不错的一篇面向对象的PHP开发模式(简写版)
2007/03/15 PHP
php array_flip() 删除数组重复元素
2009/01/14 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
PDO::_construct讲解
2019/01/27 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
23个超流行的jQuery相册插件整理分享
2011/04/25 Javascript
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
2014/02/26 Javascript
jquery 隐藏与显示tr标签示例代码
2014/06/06 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
jQuery学习笔记之2个小技巧
2015/01/19 Javascript
用iframe实现不刷新整个页面上传图片的实例
2016/11/18 Javascript
原生js更改css样式的两种方式
2017/03/15 Javascript
ES6实现的遍历目录函数示例
2017/04/07 Javascript
vue 实现通过手机发送短信验证码注册功能
2018/04/19 Javascript
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
微信小程序实现拨打电话功能的示例代码
2020/06/28 Javascript
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
浅析Python中的for 循环
2016/06/09 Python
python多进程中的内存复制(实例讲解)
2018/01/05 Python
TensorFlow入门使用 tf.train.Saver()保存模型
2018/04/24 Python
可能这些是你想要的H5软键盘兼容方案(小结)
2019/04/23 HTML / CSS
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
ParcelABC西班牙:包裹运送和快递服务
2019/12/24 全球购物
Discard Protocol抛弃协议的作用是什么
2015/10/10 面试题
致地震灾区的慰问信
2015/03/23 职场文书
学校财务管理制度
2015/08/04 职场文书
2019年家电促销广告语集锦
2019/10/21 职场文书
python实现Nao机器人的单目测距
2021/09/04 Python
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android