您可以使用 ctypes 通过对象的内存 ID 将对象传递给 celery 任务吗?
Can you pass an object to a celery task by its memory id using ctypes?
我想将我自己的对象 class 传递给 celery 任务。我没有使用 Django,这是我自己的自定义 class 不可序列化。
经过研究,我想到了将对象内存 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)
现在,当我在 celery 之外执行它时,这有效。但是当我用芹菜做的时候,我得到:
billiard.exceptions.WorkerLostError: Worker exited prematurely: signal 11 (SIGSEGV).
为什么会这样,我怎样才能实现我的目标?
更多信息: 我没有在 Celery 任务中实例化 class,因为这个 class 实例化非常慢(1-2 秒)。就我的目的而言,即使是 1 秒的延迟也很多。我想提前准备好它的实例,当我需要调用它的方法时,立即调用。
celery worker 在不同的进程中运行,可能在不同的机器上。不太可能与生成任务的进程共享内存。您将一个随机指针传递给任务,该任务取消引用它并且您得到垃圾。
如果你想以有用的方式使用 Celery,你需要以某种方式使你的对象可序列化。通过使其可腌制或更好的东西。
我想将我自己的对象 class 传递给 celery 任务。我没有使用 Django,这是我自己的自定义 class 不可序列化。
经过研究,我想到了将对象内存 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)
现在,当我在 celery 之外执行它时,这有效。但是当我用芹菜做的时候,我得到:
billiard.exceptions.WorkerLostError: Worker exited prematurely: signal 11 (SIGSEGV).
为什么会这样,我怎样才能实现我的目标?
更多信息: 我没有在 Celery 任务中实例化 class,因为这个 class 实例化非常慢(1-2 秒)。就我的目的而言,即使是 1 秒的延迟也很多。我想提前准备好它的实例,当我需要调用它的方法时,立即调用。
celery worker 在不同的进程中运行,可能在不同的机器上。不太可能与生成任务的进程共享内存。您将一个随机指针传递给任务,该任务取消引用它并且您得到垃圾。
如果你想以有用的方式使用 Celery,你需要以某种方式使你的对象可序列化。通过使其可腌制或更好的东西。