如何从Django发送异步HTTP请求并等待python2.7中的结果?

时间:2019-02-11 13:49:06

标签: django python-2.7 asynchronous celery tornado

我有多个API作为数据源,例如-博客文章。我想要实现的是从Django视图并行向该API发送请求并获取结果。无需将结果存储在db中,我需要将它们传递给我的视图响应。我的项目是用python 2.7编写的,所以我不能使用asyncio。我正在寻找有关解决此问题的最佳实践的建议(芹菜,龙卷风等),并举例说明如何实现这一目标,我只是以异步方式开始工作。谢谢。

2 个答案:

答案 0 :(得分:0)

一种解决方案是使用Celery并将您的请求参数传递给此方法,并且在前面使用AJAX。

示例:

def my_def (request):
    do_something_in_celery.delay()
    return Response(something)    

要控制任务是否在Celery中完成,可以将Celery的返回值放在变量中:

task_run = do_something_in_celery.delay()

在task_run中有一个属性.id。 您将返回该.id并使用它来监视任务的状态。

在Celery中执行的函数必须具有de装饰器@task

@task
do_something_in_celery(*args, **kwargs):

您将需要控制任务,例如Redis或RabbitMQ。

查看以下网址:

http://masnun.com/2014/08/02/django-celery-easy-async-task-processing.html

https://buildwithdjango.com/blog/post/celery-progress-bars/

http://docs.celeryproject.org/en/latest/index.html

答案 1 :(得分:0)

我使用futures lib中的current.futures ThreadPoolExecutor找到了解决方案。

fig.fullwidth = TRUE

您还可以签出rest of the concurrent.futures doc

重要! ProcessPoolExecutor类在Python 2上存在已知(不可修复)问题,因此不应依赖于该任务执行关键任务。