使用 Python 装饰器来将普通函数加入任务队列

使用 Python 装饰器来将普通函数加入任务队列

首先,我们先声明了一个 namedtuple ,其中包含以下几个元素:

  1. func :需要加入任务队列的目标函数对象
  2. argskwargs :目标函数对象的参数
  3. result_obj :用于保存目标函数返回值的一个字典, 装饰器函数将目标函数加入任务队列之后,会直接返回一个{'result': None, 'done': False}的字典。等到目标函数异步执行完成之后, Worker 会用返回值替换这一字典的result,并设置doneTrue

Worker 和普通的 Consumer 定义基本没有区别,唯一要注意的地方是,记得要用函数返回值,替换掉任务返回值字典的'result',并修改任务状态,即

同样是比较标准的 Producer ,其中queue_up函数就是这次的主角了。对于目标函数,先构建一个返回值字典,然后将目标函数和参数加入任务队列,最后返回这一返回值字典。非常简单的结构,但是使用起来非常的方便。

这里我构造了一个用来测试的代码

读者可以尝试删除掉some_operation函数前面的装饰器,对比有无这个装饰器对程序运行的影响。

可以看到,对于需要测试的some_operation函数,我仅仅是在其定义前加上了一个装饰器的调用,就使得这个函数的执行不会阻塞主线程了。并且对于异步调用函数的返回值,也很好的进行了保留传递。


untagged

509 Words

2016-07-14 23:41 +0800

-