python多线程加锁异步处理装饰器
2019独角兽企业重金招聘Python工程师标准>>>
前言:
虽谈python多线程带有全局锁PIL,似乎对性能提升没什么意义,一般考虑多进程或者协程,但PIL没有被去掉还是应该有它的用意的,一来不用考虑线程安全问题,在者处理小事务,多线程还是有一定程序上的便利性的,以下将简单描述一下应用业务上的多线程技术。
问题描述:
1.对于web请求,需要某些api需要做异步处理,例如:对于一个web请求,数据校验通过了,然后进行保存,对于用户来说,需要得到一个快速的响应才是很好的体验,检验成功的数据,也没必要让用户作无谓的保存等待。
2.对于保存的数据,需要异常的抛出逻辑异常让上层捕捉。
3.对于异步处理,需要加入队列(加锁),防止数据保存混乱。
4.开发使用需要简单,只需要加入装饰器即可。
5.被装饰的函数,有独立的锁,互不影响浪费时间。
见代码:
# encoding:utf-8 # usr/bin/python import time import hashlib import pickle import threading from functools import wrapslock_dict = {}class MyThread(threading.Thread):def __init__(self, func, args=None, kwargs=None):super(MyThread, self).__init__()self.func = funcself.args = argsself.kwargs = kwargsself.key = hashlib.sha1(pickle.dumps((self.func.func_name,))).hexdigest()self.result = None@propertydef lock(self):lock = lock_dict.get(self.key)if not lock:lock = threading.RLock()lock_dict[self.key] = lockreturn lockdef run(self):""""重写start方法,加锁,逻辑处理异常抛出异常,这里可以拓展结果返回"""try:if self.lock.acquire():self.result = self.func(*self.args)except:raisefinally:self.lock.release()def get_result(self):try:return self.result # 获取时候需要t.join(), 不然主线程比子线程跑的快,会拿不到结果except:raisedef thread_function(function):"""多线程路由函数独立锁(函数名作为唯一识别,保证函数线程安全)"""@wraps(function)def run(*args, **kwargs):try:t = MyThread(function, args=args, kwargs=kwargs)t.start()except:raisereturn rundef thread_lock(function):"""多线程路由函数独立锁(函数名作为唯一识别,保证函数线程安全)"""@wraps(function)def run(*args, **kwargs):try:key = hashlib.sha1(pickle.dumps((function.func_name,))).hexdigest()lock = lock_dict.get(key)if not lock:lock = threading.RLock()lock_dict[key] = lockif lock.acquire():function(*args, **kwargs)except:raisefinally:lock.release()return runa = 0@thread_function def test(j, k=1):global atime.sleep(5)a += 1print "a{},j{},k{}".format(a, j, k)b = 0@thread_lock def test2(j, k=1):global btime.sleep(5)b += 1print "b{},j{},k{}".format(b, j, k)def run_1():for ca in range(10):print "a"test(1, 2)def run2():for ca in range(10):print "b"t = threading.Thread(target=test2, args=(1,), kwargs={"k": 2}) # 异步处理数据避免阻塞t.start()if __name__ == "__main__":run_1()run2()
输出:
a
a
a
a
a
a
a
a
a
a
b
b
b
b
b
b
b
b
b
b
a1,j1,k2
b1,j1,k2
a2,j1,k2
b2,j1,k2
a3,j1,k2
b3,j1,k2
a4,j1,k2
b4,j1,k2
a5,j1,k2
b5,j1,k2
a6,j1,k2
b6,j1,k2
a7,j1,k2
b7,j1,k2
a8,j1,k2
b8,j1,k2
a9,j1,k2
b9,j1,k2
a10,j1,k2
b10,j1,k2
转载于:https://my.oschina.net/yves175/blog/1579727
python多线程加锁异步处理装饰器相关推荐
- python log函数_python要点-装饰器
大家有没有碰到过这种需求,扩展公司的历史项目,对功能进行扩展?拿到历史项目看源码的时候是不是头特别大,难上加难的是还要对其进行修改!!!今天要讲的是python中的重要功能-装饰器,其对满足前述的实现 ...
- python中高阶函数和装饰器_三.Python高阶函数和装饰器
1高阶函数 1.1 数学概念回顾下数学知识: y=f(x) 这是最开始接触的普通函数 y=g(f(x)) 这个就是我们接触到的高阶函数 在数学和计算机科学中,高阶函数至少应当是满足下面一个条件的函数: ...
- python中的无参装饰器和有参装饰器
python中的无参装饰器和有参装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 装饰器特点: 1>.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2>.装饰器 ...
- Python 学习笔记9(装饰器,decorator)
Python 学习笔记9(装饰器,decorator) 31 装饰器 装饰器可以对一个函数.方法或者类进行加工,是一种高级的python语法. 装饰函数 接收一个可调用对象作为输入参数,并返回一个新的 ...
- 十一. Python基础(11)—补充: 作用域 装饰器
十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...
- python中高阶函数和装饰器_Python高阶函数与装饰器函数的深入讲解
本文主要介绍的是Python高阶函数与装饰器函数的相关内容,分享给大家,下面话不多说了,来一起看看详细的介绍吧 高阶函数 1.可以使用函数对象作为参数的函数 2.或可以将函数作为返回值的函数 3.函数 ...
- Python练习之函数,装饰器,面向对象
Python练习之函数,装饰器,面向对象 1.函数 2 装饰器 3.面向对象 1.函数 编写函数,实现接受一个字符串,分别统计大小写字母,数字,其他字符的个数,并返回结果 #方法一 str=input ...
- python 三个内置装饰器,python中自带的三个装饰器
说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @propert ...
- python: 从函数了解到装饰器
Table of Contents 1. 简单了解函数 1.1. 函数是什么 1.2. 函数的好处 1.3. 函数和过程的区别 1.3.1. python的函数和过程 1.3.2. common li ...
最新文章
- Endnote X8云同步:家里单位实时同步文献笔记,有网随时读文献
- i2c--ioctl--主机控制器驱动(i2c_adapter)--外设驱动(i2c_driver)
- 将图形以PNG格式输出到浏览器或文件
- PHP程序性能优化的50种方法
- 初识CPS方法的连续动态建模
- UML学习笔记(一):UML简介
- python re模块安装_python re模块
- arcgis更改图层坐标系_以图层的形式添加 x,y 坐标数据
- Redis-03-Redis集群的搭建
- python装饰器用法
- arcgis地理空间数据库学习记录01-复制地理数据库
- pycharm中快捷键新建文件,pycharm快捷键
- 温泉PHP网络授权系统,温泉PHP授权系统验证系统完整开源
- java sencha_Sencha Cmd 5 Java 8错误
- 国内主要遥感期刊投稿信息
- word文档中插入图片显示不全解决办法
- php开启websocket服务,php实现简单的websocket服务
- ICPR 2020 U∧2-Net之AI生成肖像画,精细到毛发!
- ETag 和 Last-modified
- FreeBSD常用命令