您可以使用ctypes通过其内存ID将对象传递给celery任务吗?

问题描述 投票:1回答:1

我想将自己的类的对象传递给芹菜任务。我没有使用Django,这是我自己的自定义类,无法序列化。

研究之后,我想到了将对象内存ID作为参数传递,然后按照this answer从ID中获取对象:

tasks.py

import ctypes

@app.task
def my_task(obj_memory_id):
    my_obj = ctypes.cast(obj_memory_id, ctypes.py_object).value
    my_obj.my_method()

main.py

def main():
    obj = MyClass()
    obj_memory_id = id(obj)
    my_task.delay(obj_memory_id)

现在,当我在芹菜外进行演出时,此功能有效。但是当我用芹菜做的时候,我得到:

billiard.exceptions.WorkerLostError: Worker exited prematurely: signal 11 (SIGSEGV).

为什么会这样,我如何实现我的目标?

更多信息:我不会在Celery任务中实例化该类,因为此类的实例化非常慢(1-2秒)。就我而言,即使延迟1秒也很多。我想提前准备好它的实例,并且当我需要调用它的方法时,立即执行它。

python python-3.x redis celery pickle
1个回答
0
投票

芹菜工人在不同的过程中运行,可能在不同的机器上运行。不可能与产生任务的进程共享内存。您正在将随机指针传递给任务,该任务将其取消引用,并且您会得到垃圾。

© www.soinside.com 2019 - 2024. All rights reserved.