Django中的协同程序

时间:2017-08-17 04:20:39

标签: python django python-2.7

上下文:我正在撰写Django脚本,如下所示。据我所知,下面的循环将阻止Django应用程序并阻止其他进程运行(例如请求处理程序)。

问题:我应该怎样做Django 运行 以下循环 yield < / em> 在触发时运行其他脚本。完成所述脚本后,循环将在同一索引上 resume

# ./app.py

while True:
    items = queryItems()
    for item in items:
        process(item)

约束:答案应该适用于Python 2.7,并且仅使用支持Python 2.7的库。

1 个答案:

答案 0 :(得分:2)

有几件事:

  

据我所知,下面的循环将阻止Django应用程序并阻止其他进程运行(例如请求处理程序)。

这部分属实;循环将阻止您的当前请求,直到它完成,但它不会阻止其他请求同时发生(来自其他客户端)。每个进入的请求都将在一个单独的工作进程中执行。

  

我应该怎么做才能让Django运行以下循环并在触发它们时运行其他脚本。

我认为你在这里问的是“如何异步/并行运行process(item)?”。 Django并没有任何可以像开箱即用的那样并行运行任务的东西。如果要在返回响应之前等待所有处理完成,则可以使用多线程/多进程方法。另一个选择是使用celery这是一个异步任务运行器,可以很好地插入django。 Celery允许任务执行完全独立于请求/响应周期,并具有许多用于检查任务状态等的很好的功能。