抽空翻译了下 Python 队列 RQ 的文档
不是百分百原文翻译,而是在翻译的基础上加入了一些自己的描述
这个翻译过程我学到很多东西,主要有三点
-
污染全局命名空间
在这篇文章中 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()
压入的元素弹出来,当然了,如果这么做,还不如直接使用下面提到的方式 -
使用
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')
-
链式异常处理器
链式异常处理器在 Python 任务队列 RQ 中的异常 ( Exceptions ) 文章中提及
链式异常处理器其实很多时候都在用,但是从来没想过这么用
以前,如果某个函数捕获到了异常,但又懒得处理这些异常,那么通常的使用方式是再次抛出这个异常
throw Exception
但是这篇文章,却给了一种类似中间件的异常处理方式
也就是全局只有一个异常捕获器,当捕获到异常时,就从异常处理器列表中弹出一个处理器,让它去处理,如果这个异常处理器表示自己已经处理完成,不需要继续处理时,就终止处理,否则继续弹出下一个异常处理器
直到最后,有一个哨兵异常处理器,如果前面的异常处理器没有处理异常,那么它就是异常的终结者