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多线程加锁异步处理装饰器相关推荐

  1. python log函数_python要点-装饰器

    大家有没有碰到过这种需求,扩展公司的历史项目,对功能进行扩展?拿到历史项目看源码的时候是不是头特别大,难上加难的是还要对其进行修改!!!今天要讲的是python中的重要功能-装饰器,其对满足前述的实现 ...

  2. python中高阶函数和装饰器_三.Python高阶函数和装饰器

    1高阶函数 1.1 数学概念回顾下数学知识: y=f(x) 这是最开始接触的普通函数 y=g(f(x)) 这个就是我们接触到的高阶函数 在数学和计算机科学中,高阶函数至少应当是满足下面一个条件的函数: ...

  3. python中的无参装饰器和有参装饰器

    python中的无参装饰器和有参装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 装饰器特点: 1>.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2>.装饰器 ...

  4. Python 学习笔记9(装饰器,decorator)

    Python 学习笔记9(装饰器,decorator) 31 装饰器 装饰器可以对一个函数.方法或者类进行加工,是一种高级的python语法. 装饰函数 接收一个可调用对象作为输入参数,并返回一个新的 ...

  5. 十一. Python基础(11)—补充: 作用域 装饰器

    十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...

  6. python中高阶函数和装饰器_Python高阶函数与装饰器函数的深入讲解

    本文主要介绍的是Python高阶函数与装饰器函数的相关内容,分享给大家,下面话不多说了,来一起看看详细的介绍吧 高阶函数 1.可以使用函数对象作为参数的函数 2.或可以将函数作为返回值的函数 3.函数 ...

  7. Python练习之函数,装饰器,面向对象

    Python练习之函数,装饰器,面向对象 1.函数 2 装饰器 3.面向对象 1.函数 编写函数,实现接受一个字符串,分别统计大小写字母,数字,其他字符的个数,并返回结果 #方法一 str=input ...

  8. python 三个内置装饰器,python中自带的三个装饰器

    说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @propert ...

  9. python: 从函数了解到装饰器

    Table of Contents 1. 简单了解函数 1.1. 函数是什么 1.2. 函数的好处 1.3. 函数和过程的区别 1.3.1. python的函数和过程 1.3.2. common li ...

最新文章

  1. Endnote X8云同步:家里单位实时同步文献笔记,有网随时读文献
  2. i2c--ioctl--主机控制器驱动(i2c_adapter)--外设驱动(i2c_driver)
  3. 将图形以PNG格式输出到浏览器或文件
  4. PHP程序性能优化的50种方法
  5. 初识CPS方法的连续动态建模
  6. UML学习笔记(一):UML简介
  7. python re模块安装_python re模块
  8. arcgis更改图层坐标系_以图层的形式添加 x,y 坐标数据
  9. Redis-03-Redis集群的搭建
  10. python装饰器用法
  11. arcgis地理空间数据库学习记录01-复制地理数据库
  12. pycharm中快捷键新建文件,pycharm快捷键
  13. 温泉PHP网络授权系统,温泉PHP授权系统验证系统完整开源
  14. java sencha_Sencha Cmd 5 Java 8错误
  15. 国内主要遥感期刊投稿信息
  16. word文档中插入图片显示不全解决办法
  17. php开启websocket服务,php实现简单的websocket服务
  18. ICPR 2020 U∧2-Net之AI生成肖像画,精细到毛发!
  19. ETag 和 Last-modified
  20. FreeBSD常用命令

热门文章

  1. 让小乌龟可以唱歌——对Python turtle进行拓展
  2. Python3安装配置【转】
  3. 浅玩JavaScript的数据类型判断
  4. 设置Eclipse中的tab键为4个空格的完整方法
  5. windows内核中杀任意进程,可杀360!
  6. Thinking in JAVA笔记——第三章 操作符 第四章控制执行流程
  7. 模块化编程AMDCommonJS
  8. Linux下对SVN的相关操作命令
  9. 2012-02-25工作记录
  10. oracle循环插入数据用于测试