【问题标题】:Is a forever while loop bad for scalable program?永远的while循环对可扩展程序有害吗?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-30
    • 2021-11-18
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多