共享底层的芹菜任务

2024-09-29 22:32:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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)

将返回5100005102040,即add和{}。我知道add和{}生成ObClTask的不同子类。但是有没有办法用芹菜来达到我的需要呢?在

编辑:这可能与类属性一起使用。但这是反模式吗?在


Tags: 对象self程序addtaskreturndefval
2条回答

@app.task(base=whatever)创建了一个新的task,因此您将得到两个不同的任务实例。在

我只建议您不要使用任务实例来持久化状态—这对于只读值或本地缓存(cfthe db connection cache in the fine manual)都是可以的,但对于本用例则不是这样。如果您想在任务执行之间保持共享状态,请将您的状态保存在某个数据库中,在任务函数开始时读取它,并在完成后更新它(不要忘记设置一些锁,这样一次只有一个任务可以访问此资源)。在

我在寻找类似问题的解决方案时发现了你的问题。这就是我最后要做的。我使用RabbitMQ作为代理,使用Redis作为结果后端,但请根据您的情况进行调整:

文件obcl/对象

class ObCl(object):
    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

文件obcl/obcl_任务.py

^{pr2}$

从obcl模块的父文件夹运行芹菜。请确保使用 concurrency=1,这样您就只有一个实例工作进程来控制您的硬件。公司名称:

celery -A obcl.obcl_tasks worker  pool=solo  concurrency=1  loglevel=info

         celery@localhost v4.2.2 (windowlicker)
   ****   -
 - * ***  *   Linux-4.18.0-16-generic-x86_64-with-Ubuntu-18.04-bionic 2019-03-24 17:10:03
  * - ****  -
- **       [config]
- **       .> app:         obcl_tasks:0x7f443c0bc5c0
- **       .> transport:   amqp://guest:**@localhost:5672//
- **       .> results:     redis://localhost/
- ***  - *  - .> concurrency: 1 (solo)
  *******    .> task events: OFF (enable -E to monitor tasks in this worker)
 - *****   -
         [queues]
                .> celery           exchange=celery(direct) key=celery


[tasks]
  . obcl.obcl_tasks.add
  . obcl.obcl_tasks.mult

[2019-03-24 17:10:03,041: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//
[2019-03-24 17:10:03,049: INFO/MainProcess] mingle: searching for neighbors
[2019-03-24 17:10:04,070: INFO/MainProcess] mingle: all alone
[2019-03-24 17:10:04,086: INFO/MainProcess] celery@localhost ready.

现在,您可以调用您的任务,并应获得预期的结果。在

Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from obcl.obcl_tasks import add, mult
>>> test = add.delay(5)
>>> test.result
5
>>> test = add.delay(5)
>>> test.result
10
>>> test = mult.delay(2)
>>> test.result
20
>>> test = mult.delay(2)
>>> test.result
40

相关问题 更多 >

    热门问题