Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从龙卷风中调用芹菜任务_Python_Celery_Tornado - Fatal编程技术网

Python 从龙卷风中调用芹菜任务

Python 从龙卷风中调用芹菜任务,python,celery,tornado,Python,Celery,Tornado,如何从tornado调用芹菜任务,并通过回调获得结果 这意味着必须有人通过RabbitMQ简单地放置一条消息,然后执行任务。这是有道理的,但是有人能用python给出一个例子吗(在tornado中更好,有回调)?就个人而言,我使用mongodb作为我的消息代理,但我也可以切换到Redis或RabbitMQ 编辑:为了澄清问题,我想要一个带有回调的示例。例如,这个龙卷风代码 TestTask.delay(callback = self._on_celery_response) ... def _

如何从tornado调用芹菜任务,并通过回调获得结果

这意味着必须有人通过RabbitMQ简单地放置一条消息,然后执行任务。这是有道理的,但是有人能用python给出一个例子吗(在tornado中更好,有回调)?就个人而言,我使用mongodb作为我的消息代理,但我也可以切换到Redis或RabbitMQ

编辑:为了澄清问题,我想要一个带有回调的示例。例如,这个龙卷风代码

TestTask.delay(callback = self._on_celery_response) 
...
def _on_celery_response(self, result):
    print "hello from _on_celery_repsonse" , result
不起作用。我的测试任务是:

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

任务在没有回调的情况下正常工作。。有什么建议吗?

如果您在tornado流程的pythonpath中有一个包含任务的模块,请简单介绍:

my_task.delay()
只要在tornado实例中正确配置芹菜,它就可以工作。要在启动服务器通行证时执行此操作,请执行以下操作:

CELERY_CONFIG_MODULE=app.foo.celeryconfig

因此,当您导入芹菜时,“芹菜设置”将知道此实例的设置位置。

芹菜具有回调功能,您可以转到


回调对象也应该是芹菜任务,否则代码将无法工作

如果回调函数不一定是芹菜任务,那么可以在任务体中使用信号


我不熟悉信号。你能举个例子吗?如何使用SignalHandler函数捕获结果?不能将参数传递给处理程序,因为这是跨平台的。解决方案是在全局变量中设置芹菜任务的结果对象,然后从处理程序访问它。global CELERY\u RESULT CELERY\u RESULT=TestTask.delay(),然后设置信号处理程序并启动5秒或更长时间的计时器。之后,在处理程序中,您只需访问全局变量并调用它get_Result。另一个解决方案是更改方法。为什么不将处理函数作为普通参数传递?通过这种方式,您可以在返回后重写芹菜任务类的方法,并在此处检查任务是否完成以及状态如何,通过这种方式,您可以在此处调用处理函数。这个答案显然不是问题所要求的。海报要求提供如何在任务执行后回调Tornado处理程序的代码。
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