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对小数进行除法运算的正确方法示例
Aug 25 Python
使用Python编写提取日志中的中文的脚本的方法
Apr 30 Python
Python文件和流(实例讲解)
Sep 12 Python
python读取LMDB中图像的方法
Jul 02 Python
python实现傅里叶级数展开的实现
Jul 21 Python
Python爬取知乎图片代码实现解析
Sep 17 Python
Python Web静态服务器非堵塞模式实现方法示例
Nov 21 Python
python实现从wind导入数据
Dec 03 Python
Python实现银行账户资金交易管理系统
Jan 03 Python
python利用百度云接口实现车牌识别的示例
Feb 21 Python
基于python实现音乐播放器代码实例
Jul 01 Python
使用Pytorch实现two-head(多输出)模型的操作
May 28 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+MySQL的聊天室设计
2006/10/09 PHP
PHP 文件上传功能实现代码
2009/06/24 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
php实现等比例不失真缩放上传图片的方法
2016/11/14 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
给Function做的OOP扩展
2009/05/07 Javascript
JavaScript设置FieldSet展开与收缩
2009/05/15 Javascript
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
html5 canvas js(数字时钟)实例代码
2013/12/23 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
js实现将json数组显示前台table中
2017/01/10 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
JavaScript之Date_动力节点Java学院整理
2017/06/28 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
js刷新页面location.reload()用法详解
2019/12/09 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
python操作MySQL数据库具体方法
2013/10/28 Python
python中__slots__用法实例
2015/06/04 Python
Python的Django框架中URLconf相关的一些技巧整理
2015/07/18 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
python Scrapy框架原理解析
2021/01/04 Python
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
个人求职信范例
2014/01/29 职场文书
基层党员对照检查材料
2014/08/25 职场文书
简易离婚协议书范本2014
2014/10/15 职场文书
财务工作个人总结
2015/02/27 职场文书
个人廉洁自律总结
2015/03/06 职场文书