【问题标题】:Django asynchronous requests to remote apiDjango 对远程 api 的异步请求
【发布时间】:2015-02-04 15:35:28
【问题描述】:

我有以下代码(简化版)

for data in my_data_array:
  res = api_request(data)
  #write result to db

这些请求可能需要一些时间,而且数量很多。如何使循环的每次迭代异步并使用 Django 将已完成请求百分比的进度发送到前端。 如果我必须使用 Tornado 或 Celery,请给我链接,其中包含如何将 Django 与它们集成的信息。

【问题讨论】:

  • 你是怎么解决这个问题的?
  • @bryanph ,我有 Redis 缓存,对于每个任务我都有 [task_id]_total[task_id]_completed 键。每个请求(Celery 任务)在完成时都会增加值cache.incr(key, 1)。而且我还有 download_progress() 视图函数,它返回compl = cache.get(key_compl), total = cache.get(key_total), compl/total。与答案中的方法相同

标签: python django api asynchronous tornado


【解决方案1】:

您将需要 Celery(或其他异步任务队列)。要将其与 Django 集成,请参阅 http://celery.readthedocs.org/en/latest/django/first-steps-with-django.html。我推荐使用 Celery 和 Redis,因为 Redis 经常被用作缓存,所以你不需要为 Celery 安装另一个后端(主要是 RabbitMQ)。

要获取进度条,计算任务总数 (len(my_data_array)),将值存储在缓存中(例如 key total_count)并添加第二个 key(例如 complete_count),其值为零。在每个完成的任务中,增加 complete_count 值。

最后一步是查询状态。它只是一个简单的视图,从缓存中加载这两个值并返回给用户(html/json)。

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2018-03-04
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多