Ich habe einen laufenden Sellerie-Server mit Redis als der Borker und Ergebnisspeicher (Python3). Ich möchte eine beliebige Funktion, die nicht auf dem Server registriert wurde, von einem Selleriearbeiter ausführen lassen. Ich habe versucht, diese Funktion mit dem Paket zur Serialisierung marshal (nach Is there an easy way to pickle a python function (or otherwise serialize its code)?) und übertrug den Bytecode zu einem Arbeiter:ausführen beliebige Funktion von Sellerie Arbeiter
celery_server.py:
from celery import Celery
import types
import marshal
app = Celery('tasks', broker='redis://[email protected]//', backend='redis://localhost')
@app.task
def run_fct(fct_code, args, kwargs):
code = marshal.loads(fct.__code__)
func = types.FunctionType(code, globals(), "some_func_name")
return fct(*args, **kwargs)
client.py
from celery_server import run_fct
import marshal
def calc(x, y):
return x*y
fct_code = marshal.dumps(calc.func_code)
run_fct.apply_async((fct_code, 10, 2))
ich die Folgefehler auf der Clientseite:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe3 in position 0: invalid continuation byte
in der Funktion bytes_to_str
in kombu.utils.encoding.py
.
Gibt es einen anderen oder besseren Weg, um meine Funktion ausführen zu lassen?
Vielen Dank für jede Hilfe.