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实现通过shelve修改对象实例
Sep 26 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
python做量化投资系列之比特币初始配置
Jan 23 Python
详解tensorflow载入数据的三种方式
Apr 24 Python
Python将文本去空格并保存到txt文件中的实例
Jul 24 Python
Python Django Vue 项目创建过程详解
Jul 29 Python
详解Python list和numpy array的存储和读取方法
Nov 06 Python
Python SSL证书验证问题解决方案
Jan 13 Python
python上传时包含boundary时的解决方法
Apr 08 Python
PHP基于phpqrcode类库生成二维码过程解析
May 28 Python
keras slice layer 层实现方式
Jun 11 Python
python - asyncio异步编程
Apr 06 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简单判断两个字符串是否相等的方法
2015/07/13 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
2014/03/17 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
Ionic实现页面下拉刷新(ion-refresher)功能代码
2016/06/03 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
解决vue 单文件组件中样式加载问题
2019/04/24 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
Python2.x版本中cmp()方法的使用教程
2015/05/14 Python
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
Python变量类型知识点总结
2019/02/18 Python
Python获取Redis所有Key以及内容的方法
2019/02/19 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
python 下划线的不同用法
2020/10/24 Python
斯凯奇新西兰官网:SKECHERS新西兰
2018/02/22 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
主治医师岗位职责
2013/12/10 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
党员争先创优承诺书
2015/01/20 职场文书
大学学生个人总结
2015/02/15 职场文书
手术室消毒隔离制度
2015/08/05 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
Python基础之教你怎么在M1系统上使用pandas
2021/05/08 Python
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫
python实现会员管理系统
2022/03/18 Python
Python实现视频自动打码的示例代码
2022/04/08 Python
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python