[英]Python multithreaded server and asynchronuous websocket communication with Android clients
我有一個Android客戶端應用程序,該應用程序將一些數據發送到Python中的服務器,在該服務器中,Python服務器應運行耗時的操作/計算並將結果返回給客戶端。
為此,我最初在服務器端開始使用Flask和Python,並在客戶端開始使用異步android http庫 ,以通過http POST發送數據。 但是,我很快注意到這不是可行的方法,因為服務器上的計算需要時間,這會導致諸如客戶端出現超時錯誤等問題。
然后,我開始在服務器端使用Tornado的Websockets ,並在客戶端使用用於websockets的android庫 。 但是,第一個主要問題是,當服務器為給定客戶端運行耗時的操作時,其他潛在客戶端需要等待……讓龍卷風在多線程中工作似乎有些痛苦設置(因為最初計划是單線程的)。 另一個小問題是,如果客戶端在服務器處理其請求時脫機,則客戶端重新連接時可能永遠無法獲得結果。
因此,我想問一下,如果我想對異步多線程Python服務器進行這樣的設置,而該服務器應該使用來自客戶端的數據進行大量cpu計算而又不做任何事情,那么您是否對使用什么有任何解決方案或建議?其他潛在客戶等待輪到他們; 並可能使客戶端在重新連接時能夠從服務器獲取結果。
首先,如果要在后端執行大量CPU操作,則[最有可能]您需要在單獨的進程中運行它。 不在thread / coro / etc中。 原因是python一次只限於單線程(您可以閱讀有關GIL的更多信息)。 在多線程中執行大量CPU操作會為后端提供一些可用性,但會影響整體性能。
簡單/舊的解決方案-在多個進程(最好是線程)中運行后端。 也就是說,將您的燒瓶與gunicorn一起部署 ,為它分配多個工作進程。 這樣,您將擁有能夠執行number_of_processes - 1
繁重計算並且仍然可用於處理請求的系統。 進程的限制通常最多為cpu_cores * 2
,具體取決於cpu cpu_cores * 2
。
稍微復雜一點:
很好的接口是ProcessPoolExecutor
。 缺點是-更難處理失敗/掛起的流程
另一種解決方法是任務隊列+工作者。 celery
是最常用的一種。 想法是
這更適合真正繁重而不是實時的任務,但是可以為您提供開箱即用的故障/重啟/等處理功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.