XiaoHu日志 7/29~8/9
7/29~8/9 最近在搞過評查詢,過評查詢跟之前的課程查詢有些許異同,他們的實體定位都很不穩定,除了難以定位的“學科”實體外,過評查詢還多了一個“過評項”實體,好在這兩種實體都有著共同的特點——他們都可以被描述為一個已知詞集的子集。對于學科實體,我維護了一個通過學生課程表分詞而成的可能的學科詞匯庫,對于過評項,我也可以維護一個過評項成績庫。這兩個庫的區別在于,一個是對于全體學生永久存在的,一個是針對某人在最近十天的,他們的體量區別很大,所以我不打算存儲過評項詞匯庫。有了這兩個詞匯庫,我甚至無需再標注實體,后臺程序拿到交互命令后可以直接把兩個實體parse出來。過評查詢分為三種意圖,一種是類似于“我XX的XX多少分”的定向查詢,一種是“我XX多少分”請求recent的結果,另一種是總評查詢,語料上跟前兩種很相似,但是實現過程又比較特殊。
???????? 過評查詢需要特定的token,因為是模擬前端來獲取token,所以一個人的token就需要15秒來進行獲取。用戶發問后再去獲取顯然太慢,所以我維護一個不間斷刷新的token庫。還要考慮新用戶綁定的問題,新用戶綁定后肯定會繼續發出查詢請求,所以token也需要立即獲取,然而這15秒無法避免,只能提示用戶稍候一段時間。新token插入到庫中又會出現一個“真空”的問題。Token庫的維護流程是先讀取庫里的內容并存為數組,然后對于每個人獲取其token,再把新token更新到數組中,再把數組寫入庫中,獲取token的15秒被我叫做真空期,在真空期中針對庫的所有文件操作都是無效的,因為庫中的所有內容都在之前被讀了出來,15秒后又會寫進去,程序并不知道這15秒內發生了什么,它只會在15秒后把庫中15秒前的東西加上一個新token一塊覆蓋寫入。解決這個問題,要么在每次插入新token時都避開真空期,要么另辟捷徑。從概率角度看,法1顯然不可能。為了解決這個問題,我設置了一個緩沖文件,主程序在綁定新用戶時會把其token信息寫到緩沖文件里,在token庫的一次獲取token操作(也就是15秒真空)結束后,它會讀取緩沖文件,并將其內容append到token庫里,然后再清除緩沖文件。這樣就避開了真空期。苛刻的講,如果在讀取緩沖文件后,插入token文件前的時間區間里,主程序向緩沖文件寫入了新內容,那么新內容也會無效。不過這兩種真空沒有可比性,一個是15秒和O(1)的重合,一個是O(1)和O(1)的重合,后者可以忽略不計。在編寫這部分代碼時我也遇到了一些離奇的bug,我在對一個變量進行兩次類型轉換時會報語法錯誤,但如果我每次轉換后把它賦值給一個中間變量,然后再轉換就不會報錯,理論上這是等價的,不知道python沒有明確類型限制的變量蘊藏了什么奧妙。
????????? 在解決token庫的問題后,我又遇到了一個棘手的問題,獲取token需要學號和密碼,但是我除了用15秒去進行模擬希悅登陸外沒有其他辦法。而這15秒又足以讓微信公眾號返回超時,于是我問了希悅的工程師想知道他們表單post的api地址,誰知道他直接改了api的token限制,讓我用之前課程查詢的token就可以使用過評查詢api。解決了問題,但是我比較不爽。從6/30到現在,我至少拿了半個月的時間十幾個小時放在這個與眾不同的api和其token上,先是建個網頁來獲取需要跳轉來得到的token,然后搗鼓一下午socket.io,然后思考優化時間的方式,再維護token庫和緩沖文件,都花了我不少精力。他一抬手,我就能省下現在看來已經無謂的很多時間。我也不知道該不該刪除那些代碼。
總結
以上是生活随笔為你收集整理的XiaoHu日志 7/29~8/9的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ahu university算法设计考试
- 下一篇: 移动硬盘格式化了的数据找回方法