0

假设我需要检索作业状态,并生成一个新线程来处理作业计算:

def post_view(request):
     g = Greenlet.spawn(heavy_job, arg1, arg2)
     return json.dumps(default_response)

然后在heavy_job

def heavy_job(...):
   # call a 3rd party service to start doing its job
   job_id = (....)

   request.session['heavy_job_status'] = 'Running'
   status = 'Running'
   while status == 'Running':
       # ask the 3rd party guy "are you still running"
       resp = 3rdparty-service.query(job_id, ....)
       if resp != 'Running':
          return resp
       time.sleep(5)  # we will monkey patch the time with gevent's timer so no locking

这种while循环方法真的不适合缩放吗?还是我宁愿在每个 ajax 请求进来时查询 3rd 方服务?

4

1 回答 1

1

抱歉,我还不能写评论,所以我在这里写了一篇关于 Joel Cornett 评论的注释,并举例说明了“while”和“for”的时间。

这个例子有一个错误:timeit() 方法只执行一次初始化代码,但是主代码 - 很多次,所以使用 'while' 循环,除了第一个执行之外,每次执行都什么都不做,因为 'i' 的值已经是10. 您可以将 10 更改为 100 或 1000,并且在时间上没有区别(但不能使用“for”循环)。您还可以在 'while' 之前添加 'i = 0' 并看到非常不同的结果。

但是,我认为,这对您的代码无关紧要,因为 3rdparty-service.query() 可能比“for”和“while”循环之间的差异花费更多的时间。

于 2012-08-31T07:29:57.900 回答