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



我有几个API作为数据源,例如博客文章。我试图实现的是从 Django 视图并行向此 API 发送请求并获得结果。无需将结果存储在数据库中,我需要将它们传递给我的视图响应。我的项目是用python 2.7编写的,所以我不能使用asyncio。我正在寻找有关解决它的最佳实践(芹菜,龙卷风,其他东西?(的建议,以及如何实现这一目标的示例,我只是从异步开始。谢谢。

一个解决方案是使用 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 中执行的函数必须具有装饰器@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

我从futures lib中使用concurrent.futures ThreadPoolExecutor找到了一个解决方案。

import concurrent.futures
import urllib.request
URLS = ['http://www.foxnews.com/',
        'http://www.cnn.com/',
        'http://europe.wsj.com/',
        'http://www.bbc.co.uk/',
        'http://some-made-up-domain.com/']
# Retrieve a single page and report the URL and contents
def load_url(url, timeout):
    with urllib.request.urlopen(url, timeout=timeout) as conn:
        return conn.read()
# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    # Start the load operations and mark each future with its URL
    future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]
        try:
            data = future.result()
        except Exception as exc:
            print('%r generated an exception: %s' % (url, exc))
        else:
            print('%r page is %d bytes' % (url, len(data)))

您还可以查看 concurrent.futures 文档的其余部分。

重要!ProcessPoolExecutor 类在 Python 2 上存在已知的(不可修复的(问题,不应依赖它进行关键任务工作。

相关内容

  • 没有找到相关文章

最新更新