微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将函数作为参数传递给芹菜任务?

如何解决如何将函数作为参数传递给芹菜任务?

我想将一个函数作为参数传递给 celery 任务。我在 stackoverflow 中发现了两个类似的问题(12)。我尝试了答案中提到的解决方案,这就是我目前正在做的:

内部调用者模块:

import marshal

def function_to_be_passed:
    # ...

serialized_func_code = marshal.dumps(function_to_be_passed.__code__)
celery_task.delay(serialized_func_code)

在 celery 任务中,我正在反序列化并调用函数

import marshal,types
from celery.task import task

@task()
def celery_task(serialized_func_code):
    code = marshal.loads(serialized_func_code)
    func = types.FunctionType(code,globals(),"some_func_name")

    # calling the deserialized function
    func()

但是,在调用 celery_task.delay(serialized_func_code) 时,出现错误

kombu.exceptions.EncodeError: 'utf-8' 编解码器无法解码字节 0xe3 位置 0:无效的继续字节

在下面共享堆栈跟踪:

File “...caller.py",celery_task.delay(
File "/python3.8/site-packages/celery/app/task.py",line 426,in delay
  return self.apply_async(args,kwargs)
File "/python3.8/site-packages/celery/app/task.py",line 555,in apply_async
  content_type,content_encoding,data = serialization.dumps(
File "/python3.8/site-packages/kombu/serialization.py",line 221,in dumps
  payload = encoder(data)
File "/python3.8/contextlib.py",line 131,in __exit__
  self.gen.throw(type,value,traceback)
File "/python3.8/site-packages/kombu/serialization.py",line 54,in _reraise_errors
  reraise(wrapper,wrapper(exc),sys.exc_info()[2])
File "/python3.8/site-packages/vine/five.py",line 194,in reraise
  raise value.with_traceback(tb)
File "/python3.8/site-packages/kombu/serialization.py",line 50,in _reraise_errors
  yield
File "/python3.8/site-packages/kombu/serialization.py",in dumps
  payload = encoder(data)
File "/python3.8/site-packages/kombu/utils/json.py",line 69,in dumps
  return _dumps(s,cls=cls or _default_encoder,File "/python3.8/site-packages/simplejson/__init__.py",line 398,in dumps
  return cls(
File "/python3.8/site-packages/simplejson/encoder.py",line 296,in encode
  chunks = self.iterencode(o,_one_shot=True)
File "/python3.8/site-packages/simplejson/encoder.py",line 378,in iterencode
    return _iterencode(o,0)
kombu.exceptions.EncodeError: 'utf-8' codec can't decode byte 0xe3 in position 0: invalid continuation byte

当我使用 pickle 提供的 dumpsloads 时出现类似错误

kombu.exceptions.EncodeError: 'utf-8' 编解码器无法解码字节 0x80 位置 0:无效的起始字节

我使用的是 Django 版本 2.2.17 和 Python 版本 3.8.5

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?