我想用Python实现一个在硬件资源上执行的动作的调度程序。硬件资源封装在它自己的类中,对象包含状态信息,因此该对象应该只有一个实例。我试过用Celery来做这个。我的任务基类是:
from celery import Task
class ObClTask(Task):
def __init__(self):
self.val = 0
def add(self, add_val):
self.val += add_val
return self.val
def mult(self, mult_val):
self.val *= mult_val
return self.val
芹菜任务定义如下:
^{pr2}$我用--concurrency=1
启动celery
,以确保只生成一个worker。在
然后,运行一个像
add.delay(5)
add.delay(5)
mult.delay(2)
mult.delay(2)
将返回5
,10
,0
,0
,0
,5
,10
,20
,40
,即add
和{add
和{ObClTask
的不同子类。但是有没有办法用芹菜来达到我的需要呢?在
编辑:这可能与类属性一起使用。但这是反模式吗?在
@app.task(base=whatever)
创建了一个新的task类,因此您将得到两个不同的任务实例。在我只建议您不要使用任务实例来持久化状态—这对于只读值或本地缓存(cfthe db connection cache in the fine manual)都是可以的,但对于本用例则不是这样。如果您想在任务执行之间保持共享状态,请将您的状态保存在某个数据库中,在任务函数开始时读取它,并在完成后更新它(不要忘记设置一些锁,这样一次只有一个任务可以访问此资源)。在
我在寻找类似问题的解决方案时发现了你的问题。这就是我最后要做的。我使用RabbitMQ作为代理,使用Redis作为结果后端,但请根据您的情况进行调整:
文件obcl/对象:
文件obcl/obcl_任务.py:
^{pr2}$从obcl模块的父文件夹运行芹菜。请确保使用
concurrency=1
,这样您就只有一个实例工作进程来控制您的硬件。公司名称:现在,您可以调用您的任务,并应获得预期的结果。在
相关问题 更多 >
编程相关推荐