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 相关文章推荐
利用打码兔和超人打码自封装的打码类分享
Mar 16 Python
深入理解NumPy简明教程---数组2
Dec 17 Python
Python探索之ModelForm代码详解
Oct 26 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
python中的decorator的作用详解
Jul 26 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
Oct 28 Python
对Pycharm创建py文件时自定义头部模板的方法详解
Feb 12 Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 Python
python输出决策树图形的例子
Aug 09 Python
python装饰器原理与用法深入详解
Dec 19 Python
Python任务自动化工具tox使用教程
Mar 17 Python
Python制作表白爱心合集
Jan 22 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初学者的8点有效建议
2010/11/20 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
javascript 继承实现方法
2009/08/26 Javascript
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
2017/06/02 jQuery
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
bootstrap 点击空白处popover弹出框隐藏实例
2018/01/24 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
2019/09/11 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
2020/11/17 Vue.js
js实现鼠标拖曳效果
2020/12/30 Javascript
pymongo实现控制mongodb中数字字段做加法的方法
2015/03/26 Python
Python对文件操作知识汇总
2016/05/15 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
python标准库os库的函数介绍
2020/02/12 Python
实习自我鉴定模板
2013/09/28 职场文书
大学生标准推荐信范文
2013/11/25 职场文书
给酒店员工的表扬信
2014/01/11 职场文书
施工材料员岗位职责
2014/02/12 职场文书
天地会口号
2014/06/17 职场文书
居委会个人对照检查材料思想汇报
2014/09/29 职场文书
办理护照工作证明
2014/10/10 职场文书
工作时间擅自离岗检讨书
2014/10/24 职场文书
个人求职信格式范文
2015/03/20 职场文书
SpringRetry重试框架的具体使用
2021/07/25 Java/Android
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL
【TED出品】天梯非主流开心游1700 划水骑士
2022/03/31 魔兽争霸
使用Mysql计算地址的经纬度距离和实时位置信息
2022/04/29 MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
2022/05/30 MySQL