我學Rust 4 第一次重構筆記

2021-08-18 03:02:30 字數 1745 閱讀 3358

2018-03-21昨天調整了整個lib.rs的函式結構,除了資料庫的儲存沒做好,其它都通過執行了

有900行**了,感覺太亂,太雜,想分開檔案來做,檢視了一下別人的rust檔案的mod和檔案系統

想模仿一下,分開管理。

箱和模組

模組系統

2018-03-27終於改好了第乙個分工程模組的爬蟲版本,很粗糙。

src資料夾的檔案如下:

│  lib.rs

│  main.rs

│└─ crawler_mov

config.rs

crawler.rs

database.rs

data_structur

mod.rs

scraper.rs

spider.rs

設計是這樣的:

lib.rs是已經實現了完整的抓取搜尋網頁結果,info的json和相關資源及其json,

初步的資料庫連線和建立各種表。就不去動lib.rs了,現在是重構lib.rs

lib.rs實現的是單執行緒做法,考慮到以後會使用gui,網頁,cli等客戶端,還是需要用多執行緒來跑搜尋,

爬蟲放出去,能不斷返回爬取到的結果,客戶端收到訊息就可以重新整理介面,也能發控制命令例如停止命令給爬蟲。

spider是專職的對於乙個型別的鏈結進行爬取,爬完單個網頁,如果鏈結裡還有自己可以處理的型別,就一直爬取下去,直至沒有就停止爬取;

scraper是對於spider爬取到的內容進行提取處理結構化,返回給spider,spider集合起來,返回給crawler。

確定了這些,就是要用通道channel來進行訊息傳送了,用delegate或trait對於多執行緒資料的傳送都不是那麼理想。

瞎設計的結論是:crawler,spider,都是乙個函式搞定,引數給與返回結果的通道和接收命令的通道。

由呼叫者決定是否新開執行緒執行函式。

因此,最簡單的只爬取搜尋結果頁面的所有id的分模組是:

scraper.rs 的功能:把傳送進來的 document 內容進行查詢需要的節點,把內容提取出來,返回給 spider;

spider.rs 的功能:1,把傳送進來的 url 和 頁面序號組合後獲取網頁document,讓scraper提取裡面的id列表,傳送給通道傳送給crawler;2,把頁面序號加一,繼續步驟1,迴圈爬取,直至獲取到的網頁提取不到id出來才停止;

crawler.rs 的功能:把傳送進來的關鍵字,型別,排序條件組合成url,開通道和執行緒,呼叫spider去爬取id列表;

迴圈讀取通道內容,直至收到乙個內容為空的列表才停止;

main.rs 的功能: 開啟執行緒,呼叫crawler爬取id列表;

迴圈讀取通道內容,把讀到的內容讓乙個函式進行處理;

直至收到乙個內容為空的列表才停止;

也可通過通道傳送乙個true值,作為停止命令,讓crawler中止執行。

拆分了模組:

data_stucture.rs  

負責資料結構

database.rs

負責資料庫相關

config.rs

負責程式的引數設定

插個話題:

rust語言怎麼把已經列印出來的文字覆蓋掉?

做好 doc 做好 test,

database.rs 要做好工作,把功能用trait的方式做出來,要用 enum的形式固定sql的型別,根據型別和版本來獲取sql語句

data_structur.rs 要提供元祖,把固定的東西直接pub 提供出來,對應enum static提供出來

第一次重構

乙個新專案 訂單有八個狀態,已編制,已派發,已接單,已停單,已出庫,已上車,已卸貨,已完結 要求我根據每個狀態的查詢都寫乙個介面,並且返回的訂單資訊要過濾,而不是需要什麼在set到返回物件中。這需要我寫乙個訂單基本資訊的類orderinfo,然後根據訂單流程,不斷繼承與orderinfo或者orde...

第一次筆記

引用資料在記憶體中儲存的資料 a 100 a 是指向100的乙個引用 print id a 互動模式和直接引用的區別直接引用 a 367b 367print id a 2429337035888 每次執行結果會變 print id b 2429337035888 每次執行結果會變 print a i...

我的第一次

第一次寫部落格,把握以前的自傳寫上吧 袁傑,河南唐河人,1984年的臘月出生在乙個普通的小農家庭裡。然後就上幼兒園 家鄉叫育紅班 上小學,上初中。我是順著無數個前人走過的路走過來的,而且肯定還會有許多會順著我走過的路一直走下去。這期間,幾乎沒有什麼可以值得懷念的事,如果硬要說出一點什麼來,那就是成績...