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采用getopt解析命令行输入参数实例
Sep 30 Python
python测试mysql写入性能完整实例
Jan 18 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
python 实现在tkinter中动态显示label图片的方法
Jun 13 Python
python实现二分类的卡方分箱示例
Nov 22 Python
Python Django view 两种return的实现方式
Mar 16 Python
jupyter notebook中美观显示矩阵实例
Apr 17 Python
使用keras根据层名称来初始化网络
May 21 Python
Python函数的迭代器与生成器的示例代码
Jun 18 Python
学python需要去培训机构吗
Jul 01 Python
基于django2.2连oracle11g解决版本冲突的问题
Jul 02 Python
Python实现打包成库供别的模块调用
Jul 13 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设计模式 Interpreter(解释器模式)
2011/06/26 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
动态加载js文件 document.createElement
2006/10/14 Javascript
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
2011/11/05 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
使用nodejs开发cli项目实例
2015/06/03 NodeJs
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
解析jQueryEasyUI的使用
2016/11/22 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
vue实现图书管理demo详解
2017/10/17 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
JavaScript事件委托原理与用法实例分析
2018/06/07 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
用python实现的可以拷贝或剪切一个文件列表中的所有文件
2009/04/30 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
pandas按条件筛选数据的实现
2021/02/20 Python
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
管理部部长岗位职责
2013/12/05 职场文书
致标枪运动员广播稿
2014/02/06 职场文书
2014小学二年级班主任工作总结
2014/12/05 职场文书
大学班干部竞选稿
2015/11/20 职场文书
装修安全责任协议书
2016/03/22 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
Python多个MP4合成视频的实现方法
2021/07/16 Python