使用 Python 装饰器来将普通函数加入任务队列
使用 Python 装饰器来将普通函数加入任务队列
首先,我们先声明了一个 namedtuple ,其中包含以下几个元素:
func
:需要加入任务队列的目标函数对象args
和kwargs
:目标函数对象的参数result_obj
:用于保存目标函数返回值的一个字典, 装饰器函数将目标函数加入任务队列之后,会直接返回一个{'result': None, 'done': False}
的字典。等到目标函数异步执行完成之后, Worker 会用返回值替换这一字典的result
,并设置done
为True
Worker 和普通的 Consumer 定义基本没有区别,唯一要注意的地方是,记得要用函数返回值,替换掉任务返回值字典的'result'
,并修改任务状态,即
同样是比较标准的 Producer ,其中queue_up
函数就是这次的主角了。对于目标函数,先构建一个返回值字典,然后将目标函数和参数加入任务队列,最后返回这一返回值字典。非常简单的结构,但是使用起来非常的方便。
这里我构造了一个用来测试的代码
读者可以尝试删除掉some_operation
函数前面的装饰器,对比有无这个装饰器对程序运行的影响。
可以看到,对于需要测试的some_operation
函数,我仅仅是在其定义前加上了一个装饰器的调用,就使得这个函数的执行不会阻塞主线程了。并且对于异步调用函数的返回值,也很好的进行了保留传递。
阅读量 -