Торнадодан балдыркөкті тапсыруды сұраңыз

Қалайша біреу торнадоның сельдера тапсырмасын шақыра алады және нәтижені кері байланыс арқылы алуға болады?

Бұл пост , біреуі жай ғана хабарды RabbitMQ арқылы, содан кейін тапсырма орындалады. Бұл мағынасы бар, бірақ біреу питонға мысал келтіре ме (тіпті, торнамада жақсы, кері шақыру)? Мен өзімнің брокерім ретінде mongodb ретінде пайдаланамын, бірақ мен Redis немесе RabbitMQ-ге ауыса аламын.

EDIT: Нақты нәрселерді түсіндіру үшін кері шақыру үлгісін алғым келеді. Мысалы, бұл торнота коды

TestTask.delay(callback = self._on_celery_response) 
...
def _on_celery_response(self, result):
    print "hello from _on_celery_repsonse" , result

жұмыс істемейді. My TestTask дегеніміз не:

class TestTask(Task):
    name = "tornadoServer.Test"
    def run(self, callback=None,  **kwargs):
        result = {'result': "hello from celery task invoked by tornado"}
        if callback is not None:
            subtask(callback).delay(result)
        return result

және артқа қарай:

    File "/home/hymloth/Desktop/DJANGO/NOO1/tornadoServer/tornado/stack_context.py", line 183, in wrapped
    callback(*args, **kwargs)
  File "/home/hymloth/Desktop/DJANGO/NOO1/tornadoServer/asyncmongo/connection.py", line 183, in _parse_response
    callback(response)
  File "/home/hymloth/Desktop/DJANGO/NOO1/tornadoServer/asyncmongo/cursor.py", line 399, in _handle_response
    orig_callback(result['data'], error=None)
  File "/home/hymloth/Desktop/DJANGO/NOO1/tornadoServer/basic_auth_handlers.py", line 66, in _on_response
    celery_tasks.TestTask.delay(self._on_celery_response)
  File "/usr/local/lib/python2.6/dist-packages/celery-2.2.7-py2.6.egg/celery/task/base.py", line 338, in delay
    return self.apply_async(args, kwargs)
  File "/usr/local/lib/python2.6/dist-packages/celery-2.2.7-py2.6.egg/celery/task/base.py", line 460, in apply_async
    **options)
  File "/usr/local/lib/python2.6/dist-packages/celery-2.2.7-py2.6.egg/celery/app/amqp.py", line 230, in delay_task
    send(body, exchange=exchange, **extract_msg_options(kwargs))
  File "/usr/local/lib/python2.6/dist-packages/kombu-1.1.6-py2.6.egg/kombu/compat.py", line 101, in send
    return self.publish(*args, **kwargs)
  File "/usr/local/lib/python2.6/dist-packages/kombu-1.1.6-py2.6.egg/kombu/messaging.py", line 124, in publish
    compression, headers)
  File "/usr/local/lib/python2.6/dist-packages/kombu-1.1.6-py2.6.egg/kombu/messaging.py", line 147, in _prepare
    body) = encode(body, serializer=serializer)
  File "/usr/local/lib/python2.6/dist-packages/kombu-1.1.6-py2.6.egg/kombu/serialization.py", line 119, in encode
    payload = encoder(data)
  File "/usr/lib/python2.6/copy_reg.py", line 70, in _reduce_ex
    raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle instancemethod objects

Тапсырма кері байланыссыз жұмыс жасайды .. Кез келген ұсыныстарыңыз бар ма?

1

3 жауаптар

celery has callback function, you could go to http://ask.github.com/celery/userguide/tasksets.html

from celery.task import task
from celery.task.sets import subtask

@task
def add(x, y, callback=None):
    result = x + y

    if callback is not None:
        subtask(callback).delay(result)

    return result
1
қосылды

Егер Сізде модуль сіздің міндеттеріңізді бар болса, сіздің тородоның питонпатында қарапайым:

my_task.delay()

егер сіздің бөрене конфигурациясы дұрыс реттелген болса, жұмыс істеу керек. Серверді іске қосу кезінде мұны істеу үшін:

CELERY_CONFIG_MODULE=app.foo.celeryconfig

қоршаған ортада, сондықтан сіз балдыркөк импорттасаңыз, балдыркөк орнату осы данаға арналған параметрлерін қайда екенін біледі.

1
қосылды
Бұл сұрақтың жауабы бұл сұрақтың нені талап ететіні анық емес. Постер тапсырманы орындағаннан кейін Торнадо өңдеушісіне қайта қоңырауды қалай орындау туралы код сұрады.
қосылды автор Zoran Pavlovic, көзі

Қайта шақыру нысаны балдыркөк болуы керек немесе сіздің кодыңыз жұмыс істемейді.

Егер кері шақыру функциясы сельдерлік тапсырма болмаса, сіз тапсырмалар органының ішіндегі сигналдарды қолдана аласыз.

http://docs.python.org/library/signal.html

0
қосылды
Аргументті өңдеушіге бере алмайсыз, себебі бұл кросс платформасы болуы мүмкін. Шешім - сельдерлік тапсырманың нәтиже нысанын жаһандық айнымалы мәнге орнату және оны өңдеушіден қолжетімді ету. жаһандық CELERY_RESULT CELERY_RESULT = TestTask.delay() Сигналды өңдегішті орнатқаннан кейін және бес секундтан астам таймерді іске қосасыз. Содан кейін өңдеушіде тек global var-ге кіруге және оны get_Result-ге шақыруға болады.
қосылды автор Mauro Rocco, көзі
Тағы бір шешім - көзқарасты өзгерту. Неліктен сізге өңдеуші функциясын қалыпты дәлел ретінде жібермейсіз? Осылайша, сіз кейінгі тапсырма сабағының балдыркөк функциясын ауыстыра аласыз және мұнда тапсырманың аяқталғанын және қай мәртебесі бар екенін тексеріңіз, осылайша сіз осында сіз өңдейтін функцияны шақыра аласыз. ask.github.com/celery/userguide/…
қосылды автор Mauro Rocco, көзі
Мен сигналдармен таныс емеспін. Сіз мысал келтіре аласыз ба? Нәтижені SignalHandler функциясы арқылы қалай алуға болады?
қосылды автор hymloth, көзі