【问题标题】:Django: can functions within views run continuously even as other requests are made?Django:即使发出其他请求,视图中的功能也可以连续运行吗?
【发布时间】:2012-08-19 04:40:44
【问题描述】:

我正在尝试创建一个函数,该函数在调用时会以不规则(和未定义)的时间间隔从外部源中提取信息。然后,这些数据将被放置在数据库中以供以后检索。即使发出其他页面请求,我也希望它在后台运行。这可能吗?

【问题讨论】:

  • 绝对有可能,但是您可能想提供更多信息...为什么要从一个视图中运行此功能...您要解决的问题是什么这种方法?
  • 感谢您的回复。我是 django 的新手,我不知道您可以在视图之外运行函数。在这种情况下你会怎么称呼他们?编辑:实际上,它最好在视图中运行,以便我可以使用 http 请求调用它。
  • 如果它是一个函数,您可以从任何 Python 代码中调用它,您只需导入模块,然后调用 module.yourfn() 为什么 从 HTTP 请求中调用更好- 上下文是什么?
  • 加载页面时需要实例化与外部数据源的连接,所以我想这使得有必要将它放在视图中?

标签: django


【解决方案1】:

在请求/响应周期之外运行 Django 函数的最佳方法是将其实现为 custom management command,然后您可以使用 cron 将其设置为定期运行。

如果您已经在使用它,celery supports periodic tasks using celerybeat,但这需要configuring and running the celerybeat daemon,这可能会让人头疼。如您的问题标题中所述,Celery 还支持长时间运行的任务(事情在视图中开始,但在自己的时间完成)。

【讨论】:

  • 谢谢 - 我要试一试 'celery' - 看起来它可以满足我的要求。
【解决方案2】:

由于您似乎需要在加载页面时调用该函数,因此您可以将其放在视图中

def my_view(request):
    #Call the long running function
    long_running_function()
    #Do view logic and return
    return HttpResponse(...)

要处理long_running_function,您可以使用celery 并创建一个tasks.py,以实现您的外部数据源逻辑。创建任务,加入队列,配置celery总结here

如果您只是需要一个更简单的解决方案来尝试一下,请查看subprocess 模块。

这里有一个非常相似的答案Django: start a process in a background thread?

【讨论】:

  • 非常感谢 - 'celery' 看起来很适合这个。
猜你喜欢
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 2011-02-18
  • 1970-01-01
相关资源
最近更新 更多