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

标签 python python-3.x redis celery pickle

我想将我自己的类的对象传递给 celery 任务。我没有使用 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()

ma​​in.py

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

现在,当我在 celery 外执行它时,这是有效的。但是当我用 celery 做时,我得到:

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

这是为什么?我怎样才能实现我的目标?

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

最佳答案

celery 工作线程在不同的进程中运行,可能在不同的机器上。它不太可能与生成任务的进程共享内存。您正在向任务传递一个随机指针,该任务取消引用它,您会得到垃圾。

如果你想以有用的方式使用 Celery,你需要以某种方式使你的对象可序列化。要么让它变得可 pickle ,要么做得更好。

关于python - 您可以使用 ctypes 通过内存 id 将对象传递给 celery 任务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58633852/

相关文章:

python - 从字符串中剥离 's(撇号 s)

python - 按收藏夹中的 Twitter API 页面的时间(而不是创建时间)对收藏夹中的 Twitter API 页面进行排序

python - Discord.py create_custom_emojis 用法

list - 删除 Redis 列表中的所有条目

python - 旋转数据框后检索正常数据框

python - 更好地说明闭包?

python - 如何将包含unicode escape\u####的字符串转换为utf-8字符串

python - 在保持平衡的同时将不良球员与优秀球员配对

javascript - 使用 JavaScript 进行 Cucumber/Capybara 测试似乎不会只执行一项也使用 ActionCable 和 Redis 的测试

spring - java spring session如何自定义cookie键