从 Python 队列 RQ 文档翻译中学到的知识

yufei       4 年, 2 月 前       742

抽空翻译了下 Python 队列 RQ 的文档

不是百分百原文翻译,而是在翻译的基础上加入了一些自己的描述

这个翻译过程我学到很多东西,主要有三点

  1. 污染全局命名空间

    在这篇文章中 Python 任务队列 RQ 中的连接 ( connections ),提到 use_connection() 会污染命名空间

    一开始我百思不得其解,这怎么就污染全局命名空间了

    后来看了下 use_connection() 函数的源码实现,才发现了重点,也是这个源码,我发现了如何在函数中向全局命名空间注入内容

    def use_connection(redis=None):
    """Clears the stack and uses the given connection.  Protects against mixed
    use of use_connection() and stacked connection contexts.
    """
    assert len(_connection_stack) <= 1, \
        'You should not mix Connection contexts with use_connection()'
    release_local(_connection_stack)
    
    if redis is None:
        redis = StrictRedis()
    push_connection(redis)
    

    也就是创建一个全局变量,然后往全局变量里压入一个连接,因为 use_connection() 会成为栈顶元素,所以以后的函数从该栈中弹出连接时,也就会弹出 use_connection() 创建的连接

    当然了,看完源码也就有了解决方案,那就是使用 push_connection()use_connection() 压入的元素弹出来,当然了,如果这么做,还不如直接使用下面提到的方式

  2. 使用 with 作为上下文管理器

    同样的,还是在这篇文章中 Python 任务队列 RQ 中的连接 ( connections ),我第一次发现有人说下面这种使用方式是枯燥无味的

    from rq import Queue
    from redis import Redis
    
    conn1 = Redis('localhost', 6379)
    conn2 = Redis('remote.host.org', 9836)
    
    q1 = Queue('foo', connection=conn1)
    q2 = Queue('bar', connection=conn2)
    

    而是推荐下面这种使用 with 作为上下文管理器的方式

    with Connection(Redis('localhost', 6379)):
        q1 = Queue('foo')
        with Connection(Redis('remote.host.org', 9836)):
            q2 = Queue('bar')
        q3 = Queue('qux')
    
  3. 链式异常处理器

    链式异常处理器在 Python 任务队列 RQ 中的异常 ( Exceptions ) 文章中提及

    链式异常处理器其实很多时候都在用,但是从来没想过这么用

    以前,如果某个函数捕获到了异常,但又懒得处理这些异常,那么通常的使用方式是再次抛出这个异常

        throw Exception
    

    但是这篇文章,却给了一种类似中间件的异常处理方式

    也就是全局只有一个异常捕获器,当捕获到异常时,就从异常处理器列表中弹出一个处理器,让它去处理,如果这个异常处理器表示自己已经处理完成,不需要继续处理时,就终止处理,否则继续弹出下一个异常处理器

    直到最后,有一个哨兵异常处理器,如果前面的异常处理器没有处理异常,那么它就是异常的终结者

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.