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实现简单的计时器功能函数
Mar 14 Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 Python
Python实现简单遗传算法(SGA)
Jan 29 Python
python实现多线程行情抓取工具的方法
Feb 28 Python
python中import与from方法总结(推荐)
Mar 21 Python
wxpython+pymysql实现用户登陆功能
Nov 19 Python
Django3.0 异步通信初体验(小结)
Dec 04 Python
pytorch ImageFolder的覆写实例
Feb 20 Python
python如何判断IP地址合法性
Apr 05 Python
Python中Selenium模块的使用详解
Oct 09 Python
python urllib和urllib3知识点总结
Feb 08 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 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
在windows iis5下安装php4.0+mysql之我见
2006/10/09 PHP
php HandlerSocket的使用
2011/05/02 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
PHP中文乱码解决方案
2015/03/05 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
Javascript 刷新全集常用代码
2009/11/22 Javascript
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
基于jquery的无限级联下拉框js插件
2011/10/29 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
微信小程序获取微信运动步数的实例代码
2017/07/20 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
Vue.set 全局操作简单示例
2019/09/19 Javascript
[01:05:00]2018国际邀请赛 表演赛 Pain vs OpenAI
2018/08/24 DOTA
Python创建模块及模块导入的方法
2015/05/27 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
Win10下python3.5和python2.7环境变量配置教程
2018/09/18 Python
对Python中画图时候的线类型详解
2019/07/07 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
SmartBuyGlasses英国:购买太阳镜和眼镜
2018/01/29 全球购物
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
紧急通知
2015/04/17 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书
《给予树》教学反思
2016/03/03 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
警用民用对讲机找不同
2022/02/18 无线电