2017-02-27 101 views
2

我有一個Web服務(REST),其中一個請求可能需要長達30秒才能返回一個答案(大量計算)。在計算過程中,客戶端瀏覽器會中止(?)現有連接並重試。這裏是服務器端的控制檯輸出:Flask/http-告訴客戶端請求需要更多時間來完成

Exception happened during processing of request from ('127.0.0.1', 53209) 
Traceback (most recent call last): 
    File "C:\Users\tmx\Anaconda2\lib\SocketServer.py", line 290, in _handle_request_noblock 
    self.process_request(request, client_address) 
    File "C:\Users\tmx\Anaconda2\lib\SocketServer.py", line 318, in process_request 
    self.finish_request(request, client_address) 
    File "C:\Users\tmx\Anaconda2\lib\SocketServer.py", line 331, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "C:\Users\tmx\Anaconda2\lib\SocketServer.py", line 654, in __init__ 
    self.finish() 
    File "C:\Users\tmx\Anaconda2\lib\SocketServer.py", line 713, in finish 
    self.wfile.close() 
    File "C:\Users\tmx\Anaconda2\lib\socket.py", line 283, in close 
    self.flush() 
    File "C:\Users\tmx\Anaconda2\lib\socket.py", line 307, in flush 
    self._sock.sendall(view[write_offset:write_offset+buffer_size]) 
error: [Errno 10053] An established connection was aborted by the software in your host machine 

一個選擇是什麼,我認爲是以某種方式通知客戶端,「我alivem但請求仍需要一些時間」,或以某種方式設置服務器端的超時。有什麼可能性?

回答

0

在您返回一些數據後,很難在Flask中運行代碼。您的選擇是使用類似任務隊列的東西(請參閱Celery),或者在多個部分中產生響應。

Flask中的視圖可以返回字符串,但它們也可以返回包含字符串的迭代。因此,您可以返回​​,["abc"]或發電機,將產生​​。如果您在收益率之間進行處理,則數據將在請求仍在運行時發送給客戶端。

看看下面的例子:

def generator_that_does_the_calculation(): 
    sleep(1) 
    yield "I'm alive, but I need some time\n" 
    sleep(1) 
    yield "Still alive here\n" 
    sleep(1) 
    yield "Done\n" 

@app.route('/calculate') 
def calculate(): 
    return Response(generator_that_does_the_calculation()) 
+0

嗯,聽起來很有道理。雖然我得到一個TypeError:'generator'對象不可調用。任何想法? – ThomasMX

+0

嘗試返回'Response(generator_that_does_the_calculation())' –

+0

謝謝,這種方式它的工作原理。請更新您的原始答案:) – ThomasMX

相關問題