Vraag django-selder: Creëer en registreer dynamisch een taak


Ik wil toevoegen van willekeurige taken met behulp van django-celery. Momenteel heb ik een klasse gemaakt die lijkt op die hieronder (alleen een voorbeeld, echte klassen hebben meer dan dit):

from celery.task import task

class Delayer(object):
    def delay(self, func, minutes):
        return task(func, name="%s.delayed"%self.__class__.__name__)\
            .apply_async(countdown=minutes*60)

Ik loop selderie als volgt:

python manage.py celeryd -E -B -lDEBUG

Wanneer ik mijn vertragingsmethode probeer uit te voeren vanuit een django-schil [bijv Delayer().delay(lambda: 1, 1)], Ik krijg een fout als deze in mijn uitvoer van celeryd:

[2013-01-02 15:26:39,324: ERROR/MainProcess] Received unregistered task of type "Delayer.delayed".
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.

The full contents of the message body was:
{'retries': 0, 'task': "Delayer.delayed", 'eta': '2013-01-02T21:27:39.320913', 'args': [], 'expires': None, 'callbacks': None, 'errbacks': None, 'kwargs': {}, 'id': '99d49fa7-bd4b-40b0-80dc-57309a6f19b1', 'utc': True} (229b)

Traceback (most recent call last):
  File "/home/simon/websites/envs/delayer/local/lib/python2.7/site-packages/celery/worker/consumer.py", line 432, in on_task_received
    strategies[name](message, body, message.ack_log_error)
KeyError: "Delayer.delayed"

Mijn vraag is, is het mogelijk om dergelijke dynamisch gemaakte taken te registreren? Zo nee, welke andere methode kan ik gebruiken om hetzelfde effect te bereiken met selderij?


10
2018-01-02 21:36


oorsprong


antwoorden:


Het simpele antwoord is dat je dat niet kunt; omdat selderij in een ander proces wordt uitgevoerd, moet het in staat zijn om elke code die als een selderietaak wordt uitgevoerd, te importeren; je gegenereerde callable is dat niet, dus de manier waarop selderij rond verwijzingen naar callables beweegt, werkt niet.

Dit suggereert echter een mogelijke manier om dingen aan te vallen: als je een andere manier kunt verzinnen om je callable te serialiseren, dan kun je het als een argument voor een eenvoudige selderietaak opgeven. Deze vorige vraag kan helpen. Let op de waarschuwende vermeldingen van beveiliging :-)


11
2018-01-04 22:49