本文鏈接:https://blog.csdn.net/qq965194745/article/details/80034993
實現思路
https://blog.csdn.net/q1w2e3r4470/article/details/72702406
我主要是借鑒了這篇博客的思路
我來簡述一下他的思路,他前端用到了ajax異步請求,一個用於獲取冗長的數據,就比如我后台要跑一千次統計,是需要很長時間的,另一個是一個周期ajax,每隔一段時間就去后台訪問拿數據,后台巧妙的地方是開了一個全局變量,用於存放程序運行的狀態,偽代碼如下
全局變量s
主函數(前端請求這個鏈接需要比較長的時間才能返回數據):
s=0
''''
后台處理數據
''''
s=10
''''
后台處理數據
''''
如此重復
最后返回數據的時候s=100
輔助函數:
返回s的值
這是他的實現思路,就是通過全局變量給主函數插樁,告知輔助函數主函數運行到哪一步了
兩個ajxa用的很巧妙,很簡單的一個實現方法
它山之石可以攻玉
他的思路的問題是沒有考慮到並發性,多用戶下肯定是不能用同一個全局變量s的
我的一個思路
眾所周知,每個用戶都有一個獨立的會話,那么就可以,把這個全局變量存在session里面,實現互相不干擾。
思路肯定沒問題的,但是被ajax的機制坑了,ajax異步請求的時候session是不能在后台函數沒有執行完成的時候更新的,這就導致輔助函數不能訪問到沒執行完成主函數的session的
我的第二個思路
那么session不行,我索性將全局變量改成一個map,前端兩個ajax在訪問后台的時候,帶一個隨機數過去,作為map的key,全局變量作為map的value,這樣隨機數的沖突是很小的,后台執行進度可以並發訪問了
前端偽代碼
ajax1:
異步訪問主函數
傳遞一個隨機數seed
等待數據返回並顯示
殺死定時器
定時器:
ajax2:
異步訪問輔助函數
傳遞一個隨機數seed
拿到后台map中的全局變量
更改進度條顯示為全局遍歷的值
使用flask框架踩過的一些坑
首先要開啟flask的多線程
不然后台是單線程的,前端異步訪問,后台在處理主函數的時候根本無暇顧及輔助函數
app.run(debug=True, threaded=True)
前端的form表單,JavaScript處理完要之后要return false,不然JavaScript提交一次后台,html表單又提交一次。。。
前端form表單設置了pattern值之后,點擊事件,先是JavaScript那里處理,然后才經過pattern,所以JavaScript也要正則匹配,成功就處理完return false,不成功就return true,給pattern處理,input標簽自帶前端提示
————————————————
版權聲明:本文為CSDN博主「請叫我西木同學」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq965194745/article/details/80034993