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中使用socket发送HTTP请求数据接收不完整问题解决方法
Feb 04 Python
Windows下为Python安装Matplotlib模块
Nov 06 Python
浅谈python中的getattr函数 hasattr函数
Jun 14 Python
微信跳一跳小游戏python脚本
Jan 05 Python
Python简单定义与使用二叉树示例
May 11 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
Nov 07 Python
Python如何爬取实时变化的WebSocket数据的方法
Mar 09 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
Apr 18 Python
我就是这样学习Python中的列表
Jun 02 Python
30行Python代码实现高分辨率图像导航的方法
May 22 Python
python程序如何进行保存
Jul 03 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
Dec 08 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
5.PHP的其他功能
2006/10/09 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
js数组常用操作方法小结(增加,删除,合并,分割等)
2016/08/02 Javascript
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
2017/10/26 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
2018/09/19 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
JavaScript实现随机点名器
2020/03/25 Javascript
python实现代码行数统计示例分享
2014/02/10 Python
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
Python兔子毒药问题实例分析
2015/03/05 Python
Python实现的概率分布运算操作示例
2017/08/14 Python
Python实现生成随机数据插入mysql数据库的方法
2017/12/25 Python
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
python 批量将中文名转换为拼音
2021/02/07 Python
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
丝芙兰加拿大官方网站:SEPHORA加拿大
2018/11/20 全球购物
大学生优秀的自我评价分享
2013/10/22 职场文书
小学科学教学反思
2014/01/26 职场文书
诚信考试标语
2014/06/24 职场文书
关于读书的演讲稿1000字
2014/08/27 职场文书
干部个人考察材料
2014/12/24 职场文书
关于清明节的演讲稿2015
2015/03/18 职场文书
书法社团活动总结
2015/05/07 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
Hive日期格式转换方法总结
2022/06/25 数据库