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中MySQLdb模块用法实例
Nov 10 Python
深入源码解析Python中的对象与类型
Dec 11 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
Sep 11 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
如何优雅地处理Django中的favicon.ico图标详解
Jul 05 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
Jun 10 Python
Django后台admin的使用详解
Jul 08 Python
Django使用中间键实现csrf认证详解
Jul 22 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
Dec 19 Python
python爬虫模块URL管理器模块用法解析
Feb 03 Python
python使用XPath解析数据爬取起点小说网数据
Apr 22 Python
python异步的ASGI与Fast Api实现
Jul 16 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
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
dess中一个简单的多路委托的实现
2010/07/20 Javascript
获取鼠标在div中的相对位置的实现代码
2013/12/30 Javascript
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
2016/12/31 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
2017/11/16 Javascript
Vue中插入HTML代码的方法
2018/09/21 Javascript
js实现菜单跳转效果
2020/12/11 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
老生常谈python的私有公有属性(必看篇)
2017/06/09 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
详解CSS3浏览器兼容
2016/12/14 HTML / CSS
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
个人求职简历中英文自我评价
2013/12/16 职场文书
某同学的自我鉴定范文
2013/12/26 职场文书
欢迎新生标语
2014/10/06 职场文书
化工见习报告范文
2014/10/31 职场文书
教师调动申请报告
2015/05/18 职场文书
博士论文答辩开场白
2015/06/01 职场文书
法人代表证明书范本
2015/06/18 职场文书
感恩教育主题班会
2015/08/12 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
Python测试框架pytest高阶用法全面详解
2022/06/01 Python
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android