你能用ctypes通过一个对象的内存id把它传递给一个celence任务吗



我想将自己类的一个对象传递给一个芹菜任务。我没有使用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,则需要以某种方式使对象可序列化。要么让它变得可采摘,要么做得更好。

相关内容

  • 没有找到相关文章

最新更新