上下文:我正在撰写Django
脚本,如下所示。据我所知,下面的循环将阻止Django
应用程序并阻止其他进程运行(例如请求处理程序)。
问题:我应该怎样做Django
运行 以下循环 yield < / em> 在触发时运行其他脚本。完成所述脚本后,循环将在同一索引上 resume 。
# ./app.py
while True:
items = queryItems()
for item in items:
process(item)
约束:答案应该适用于Python 2.7
,并且仅使用支持Python 2.7
的库。
答案 0 :(得分:2)
有几件事:
据我所知,下面的循环将阻止Django应用程序并阻止其他进程运行(例如请求处理程序)。
这部分属实;循环将阻止您的当前请求,直到它完成,但它不会阻止其他请求同时发生(来自其他客户端)。每个进入的请求都将在一个单独的工作进程中执行。
我应该怎么做才能让Django运行以下循环并在触发它们时运行其他脚本。
我认为你在这里问的是“如何异步/并行运行process(item)
?”。 Django并没有任何可以像开箱即用的那样并行运行任务的东西。如果要在返回响应之前等待所有处理完成,则可以使用多线程/多进程方法。另一个选择是使用celery这是一个异步任务运行器,可以很好地插入django。 Celery允许任务执行完全独立于请求/响应周期,并具有许多用于检查任务状态等的很好的功能。