lua中實現異步資源讀寫


同樣還是更新方面的需求,當我們檢測到版本是新安裝的以后,要進行upd目錄清除。如果使用os.execute執行 rm -rf ooxx 是非常快的
但由於os.execute一旦報錯,那整個lua進程就杯具了。於是,我們最后換成了lfs來進行目錄遍歷並逐個刪除。
這樣一來,文件數目如果過多,會等很久。於是想到使用異步的方式來處理。

一開始我嘗試了lua的協程,我以為他和golang等語言中的一樣。可以實現輕量級線程。
於是我做了一個簡單的測試

h = coroutine.creat( function() for i=0,100000 do print("hahahahahaha") end end )
coroutine.resume(h)
print("oh yeah,i am here")



按我的期望是,最后這句話會在一堆hahahahaha中出現。 而實際上,是要等所有的hahahahaha打印完了,才出現。
協程看來不是我想像中的那貨。

那又怎么辦呢,引入線程? 剛剛返回的h就是一個thread
看來在lua中使用線程行不同,那如果用c++實現一個異步的等效函數,並提供一個監聽呢。這樣無疑是很ok的。
從唐門世界的更新模塊中我發現它就是用java和oc分別實現的android和ios

這樣下去,走太遠了。
我們回過頭來看看,我們之所以面臨這個問題是因為,為了累加更新,我們的文件很小,沒有打包。
基於這個特性我們可以想到,我們的單個文件刪除的開銷是極小的。
於是,我們可以采用如下技巧

遍歷出所有要刪除的文件放入一個table

在onEnterFRame中,一次處理一定數目的文件,直到全部處理完。


這個技巧對單個文件不大的項目非常有效,這個技巧源自我們公司的關卡pre loading方案。 避免了線程問題,同時又使得圖形有機會渲染,保證了進度條的更新和防止畫面假死。

此技巧在目前公司所有項目中都有使用,大家不用再糾結可行性了,大膽嘗試吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM