2011-05-03 85 views
0

夥計。我正在閱讀web.py源代碼以瞭解WSGI框架如何工作。爲什麼在生成器函數中調用清除代碼?

當讀取application.py模塊時,我想知道爲什麼在清理中調用self._cleanup這是一個生成器函數。

我搜索使用生成器的原因,如this,但我不知道爲什麼在這裏使用生成器。

這裏是代碼塊:

def wsgi(env, start_resp): 
    # clear threadlocal to avoid inteference of previous requests 
    self._cleanup() 

    self.load(env) 
    try: 
     # allow uppercase methods only 
     if web.ctx.method.upper() != web.ctx.method: 
      raise web.nomethod() 

     result = self.handle_with_processors() 
     if is_generator(result): 
      result = peep(result) 
     else: 
      result = [result] 
    except web.HTTPError, e: 
     result = [e.data] 

    result = web.utf8(iter(result)) 

    status, headers = web.ctx.status, web.ctx.headers 
    start_resp(status, headers) 

    def cleanup(): 
     self._cleanup() 
     yield '' # force this function to be a generator 

    return itertools.chain(result, cleanup()) 

回答

1

做什麼itertools.chain(result, cleanup())實際上是

def wsgi(env, start_resp): 
    [...] 

    status, headers = web.ctx.status, web.ctx.headers 
    start_resp(status, headers) 

    for part in result: 
     yield part 
    self._cleanup() 
    # yield '' # you'd skip this line because it's pointless 

我能想象它爲什麼寫得這麼奇怪的是,唯一的原因是爲了避免額外的純Python循環一點點的表現。

+0

感謝您的回覆。這是合理的。我重新思考代碼,我猜想另一個原因是儘快將結果返回給客戶端,然後再做清理工作以避免延遲。不確定是否正確。 – 2011-05-03 15:53:02

相關問題