2017-08-17 308 views
0

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

问题:我应该这样做Django运行下面的循环和产量他们被触发时运行其他脚本。如果说剧本完成后,在相同指数循环将简历

# ./app.py 

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

约束:答案应该在Python 2.7工作,只使用库支持Python 2.7

回答

2

几件事情:

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

这是部分正确的;循环将阻止你当前请求,直到它已经完成了,但它不会(从其他客户)发生的同时阻止其他请求。每个进入的请求都将在一个单独的工作进程中执行。

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

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