假设我需要检索作业状态,并生成一个新线程来处理作业计算:
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请求进入时查询第三方服务?
答案 0 :(得分:1)
很抱歉,我还不能写评论,所以我在这里写了一篇关于Joel Cornett的评论的说明,其中包括'while'和'for'的时间示例。
这个例子中有一个错误:timeit()方法只执行一次初始化代码,但是主代码 - 很多次,所以使用'while'循环每次执行除了第一个执行没有因为'i的值' '已经是10.你可以改变10为100或1000并且没有时间差异(但不是'for'循环)。您还可以在'while'之前添加'i = 0',并看到非常不同的结果。
但是,我认为,对于你的代码并不重要,因为3rdparty-service.query()可能比'for'和'while'循环之间的差异花费更多的时间。