我想将自己类的一个对象传递给一个芹菜任务。我没有使用Django,这是我自己的自定义类,不可序列化。
经过研究,我想到了将对象内存id作为参数传递,然后根据以下答案从id中获取对象:
任务.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秒的延迟也是很大的。我想提前准备好它的实例,当我需要调用它的方法时,立即调用它。
芹菜工人在不同的过程中运行,可能在不同的机器上运行。不太可能与产生任务的进程共享内存。您正在向任务传递一个随机指针,该任务取消了对它的引用,您得到了垃圾。
如果您想以有用的方式使用Celery,则需要以某种方式使对象可序列化。要么让它变得可采摘,要么做得更好。