0
点赞
收藏
分享

微信扫一扫

Python装饰器与GIL锁解释


Python 进阶篇-系列文章全篇

🍑 Linux操作系统与常用命令 🍑 Linux系统性能定时监控升级,源码可复制
🍑 tcp网络程序的实现步骤,看这个就够了
🍑 http请求与响应,tcp3次握手&四次挥手
🍑 模拟浏览器实现,服务端基础框架搭建
🍑 Python进阶:利用线程实现多任务
🍑 Python进阶:进程的状态及基本操作
🍑 Python进阶:一文搞懂迭代器、生成器、协程(附案例)
🍑 数据库:了解MySQL数据类型、SQL命令
🍑 从零开始学SQL:where条件查询与连接
🍑 Python网络开发基础,实现udp聊天器小案例
🍑 多任务版TCP服务端程序开发案例+源码
🍑 【图文教程详解】Ubuntu的两种安装方式
🍑 Python中的深拷贝与浅拷贝

文章目录

  • Python 进阶篇-系列文章全篇
  • 1. 在原装饰器上设置外部变量
  • 2. 多重装饰器
  • 3. 类装饰器
  • 4. GIL锁引入
  • 5. GIL概念及影响
  • 6. GIL解决方案

1. 在原装饰器上设置外部变量

  • 作用:向装饰器内部传递参数
  • 格式:

def test(path):
   def function_out(func):
   	  def function_in():
   	     ....
   	  return function_in
   return function_out

  • 使用:
    @test(“login.py”)
  1. test(login.py) —> function_out
  2. @ 第一步的结果 ——> @ founction_out

2. 多重装饰器

  • 多重装饰器:给一个函数进行多次装饰
  • 装饰原则:就近原则(靠近待装饰函数的先装饰,随后一层一层装饰)

3. 类装饰器

  • 作用:使用一个类为一个函数装饰
  • 类的书写:

必须有两个方法

  1. init 方法,必须接收 装饰器传递的参数 func

2)call方法, self.func()

# 装饰器类
class Test(object):

    def __init__(self,func):
        print("----init----方法")
        print("---func--", func)
        # func 是login函数的引用
        self.func = func

    def run(self):
        print("---正在疯跑---")

    def __call__(self, *args, **kwargs):
        print("----开始验证----")
        # 调用原来login的内容
        self.func()

  • 格式:@类名
    待装饰的函数

@Test

def login():

login = Test(login)

login() —> 调用类的 __call__方法

  • 对象名() 调用对象的 __call__()

4. GIL锁引入

  • 监控资源的竞争情况 htop
  • 资源的消耗的情况
  • 单进程 1核
  • 多进程 多核
  • 多线程 多核但是很低 gil锁的问题

5. GIL概念及影响

  • Gil 全局解释器锁
  • GIL跟python语言没有关系,Python底层解释器Cpython的问题
  • GIL释放的情况
  • 线程执行完毕释放
  • I/O 阻塞的时候释放
  • Python 3.x使用计时器(执行时间达到阈值后,当前线程释放GIL)

6. GIL解决方案

  • 解决方案:
  • 更换解释器 Jpython pypy
  • 用进程替换线程(进程会占用更多的系统资源)
  • 子线程用C语言实现(test.c–>libtest.so–>python加载)


举报

相关推荐

0 条评论