2015-06-04 40 views
0

我想了解以下底漆:aiohttp拉姆達在loop.start_server()方法

if __name__ == '__main__': 
    loop = asyncio.get_event_loop() 
    f = loop.create_server(
    lambda:  HttpRequestHandler(debug=True, keep_alive=75), 
    '0.0.0.0', '8080') 
    srv = loop.run_until_complete(f) 
    print('serving on', srv.sockets[0].getsockname()) 
try: 
    loop.run_forever() 
except KeyboardInterrupt: 
    pass 

爲什麼在asyncio.create_server方法拉姆達nottation?從asyncio文檔中,此方法接受類/函數作爲入口點。 HttpRequestHandler的。如果其attemt啓動類,並通過初始化實例循環,那麼即時通訊完全喪失,因爲我有奇怪behavion,初始化方法調用每一個請求:

class  HttpRequestHandler(aiohttp.server.ServerHttpProtocol): 
    def __init__(self): 
     print(id(self)) 

回答

0

我明白: 所有教學班, HttpServerProtocol父母是回調,初始化每一個請求。爲了節省狀態請求之間,或處理任何agregate邏輯我們需要新的對象:

DEF處理(): DEF 初始化(個體,環): #instance變量self.loop =環等 @asyncio。 (自我) a = asyncio.async(self.FirstMethod(),loop = self.loop) b = asyncio.async(self.SecondMethod(),loop = self.loop) 從asyncio .gather(* [a,b])

將我們的Logic類實例傳遞給Proto類並添加服務協程方法來執行,如:loop.run_until_comple TE(protoInstance.serve)。 它適用於我。