【问题标题】:Celery shared data芹菜共享数据
【发布时间】:2019-08-30 17:57:22
【问题描述】:

我已经使用 Django 通道在 Django 应用程序中实现了 websocket,现在前端通过 websocket 发送一些数据,我希望当前正在运行的 celery 任务能够读取它。我尝试创建共享内存静态对象,但不工作。

   SimulationInputs.add(simulation_id=simulation.id, init_data=init_inputs)
    return InteractiveSimulationTask.delay_or_fail(
        simulation_id=simulation.id
    )
class SimulationData:
    data = ''


class SimulationInputs:
    data = None

    @classmethod
    def init_manager(cls, manager):
        manager = Manager()
        cls.data = manager.dict()

    @classmethod
    def add(cls, simulation_id, init_data):
        cls.data[simulation_id] = init_data

    @classmethod
    def write(cls, simulation_id, simulation_data):
        if cls.data.get(simulation_id):
            cls.data[simulation_id] = simulation_data

    @classmethod
    def read(cls, simulation_id, simulation_data):
        simulation_data.data = cls.data.get(simulation_id)

# manage.y
if __name__ == "__main__":
    SimulationInputs.init_manager()

class InteractiveSimulationTask(JobtasticTask):
     def calculate_result(self, simulation_id, **kwargs):
         while True:
           SimulationInputs.read(simulation_id=self.simulation.id, simulation_data=simulation_data)   

任务总是抛出异常cls.data.get(simulation_id): NoneObjectType has no method get

我需要在 celery 任务和主进程之间共享数据。

有什么提示吗?

【问题讨论】:

    标签: python django multiprocessing celery


    【解决方案1】:

    由于您使用的是 celery,因此您可能有 redis 或其他一些可用的内存存储。考虑将其用作间接层,即readwrite 方法使用simulation_id 作为simulation data 的键

    我相信您面临的问题是由于 python class 的生命周期。在init_manager 中,当您分配给cls.data 时,您将覆盖class 的属性,而不是实例的属性。正如错误消息所证明的那样,这并不符合您的要求:cls.data 将是None

    我认为您想要的是“单例模式”。您希望拥有一个且唯一的 SimulationInputs 对象,该对象可以读取/写入每个 ID 的数据。这个讨论可以帮助你implementing a singleton in python

    【讨论】:

      【解决方案2】:

      我得出的结论是 Django 和 celery 不应该共享内存,因为它们存在差异。进程并且它们是差异程序,因此它们应该通过套接字或消息传递系统进行通信。我通过使用 redis Pub/Sub https://redis.io/topics/pubsub 解决了我的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-18
        • 2013-01-09
        • 2012-05-01
        • 1970-01-01
        • 2012-03-22
        • 1970-01-01
        • 1970-01-01
        • 2018-04-06
        相关资源
        最近更新 更多