簡體   English   中英

Python多線程服務器和與Android客戶端的異步Websocket通信

[英]Python multithreaded server and asynchronuous websocket communication with Android clients

我有一個Android客戶端應用程序,該應用程序將一些數據發送到Python中的服務器,在該服務器中,Python服務器應運行耗時的操作/計算並將結果返回給客戶端。

為此,我最初在服務器端開始使用Flask和Python,並在客戶端開始使用異步android http庫 ,以通過http POST發送數據。 但是,我很快注意到這不是可行的方法,因為服務器上的計算需要時間,這會導致諸如客戶端出現超時錯誤等問題。

然后,我開始在服務器端使用Tornado的Websockets ,並在客戶端使用用於websocketsandroid庫 但是,第一個主要問題是,當服務器為給定客戶端運行耗時的操作時,其他潛在客戶端需要等待……讓龍卷風在多線程中工作似乎有些痛苦設置(因為最初計划是單線程的)。 另一個小問題是,如果客戶端在服務器處理其請求時脫機,則客戶端重新連接時可能永遠無法獲得結果。

因此,我想問一下,如果我想對異步多線程Python服務器進行這樣的設置,而該服務器應該使用來自客戶端的數據進行大量cpu計算而又不做任何事情,那么您是否對使用什么有任何解決方案或建議?其他潛在客戶等待輪到他們; 並可能使客戶端在重新連接時能夠從服務器獲取結果。

首先,如果要在后端執行大量CPU操作,則[最有可能]您需要在單獨的進程中運行它。 不在thread / coro / etc中。 原因是python一次只限於單線程(您可以閱讀有關GIL的更多信息)。 在多線程中執行大量CPU操作會為后端提供一些可用性,但會影響整體性能。

  1. 簡單/舊的解決方案-在多個進程(最好是線程)中運行后端。 也就是說,將您的燒瓶與gunicorn一起部署 ,為它分配多個工作進程。 這樣,您將擁有能夠執行number_of_processes - 1繁重計算並且仍然可用於處理請求的系統。 進程的限制通常最多為cpu_cores * 2 ,具體取決於cpu cpu_cores * 2

  2. 稍微復雜一點:

    • 接受數據
    • 在不同的過程中運行繁重的功能
    • 收集結果,返回

    很好的接口是ProcessPoolExecutor 缺點是-更難處理失敗/掛起的流程

  3. 另一種解決方法是任務隊列+工作者。 celery是最常用的一種。 想法是

    • 打開WS連接
    • 將任務放入隊列
    • 工作人員(在不同的流程甚至不同的物理節點中)最終選擇任務,對其進行計算,並將結果放入某個數據庫中
    • 主進程獲取對結果數據庫的長時間輪詢的回調​​/結果
    • 主流程通過WS發送結果

    這更適合真正繁重而不是實時的任務,但是可以為您提供開箱即用的故障/重啟/等處理功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM