【发布时间】:2012-08-24 11:37:19
【问题描述】:
假设我需要检索作业状态,并生成一个新线程来处理作业计算:
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 方服务?
【问题讨论】:
-
在 python 中,
for循环比while循环快。 -
您建议使用发电机?我可以编写一个内部包含
3rdpart-servier.query(...)的简单生成器,并且生成器接收job_id。但它可以同时处理 2 个用户吗? -
@AshwiniChaudhary:
>>> import timeit >>> tfor = timeit.Timer("for i in l: t += i", "t, l = 0, range(10)") >>> twhile = timeit.Timer(""" while i < 10: t += i i += 1""", "t = i =0") >>> tfor.timeit() 0.676494836807251 >>> twhile.timeit() 0.05109286308288574 >>> -
轮询通常不利于缩放。您无法收到来自该第 3 方的回电?
标签: python scalability gevent