Linux平台下C 實現的新聞推薦系統

2021-08-20 17:33:38 字數 1739 閱讀 9852

新聞推薦系統能夠支援使用者登入,註冊,檢索新聞,並根據登入使用者的瀏覽記錄進行新聞推薦。支援360瀏覽器,chrome瀏覽器,ie瀏覽器,安卓手機瀏覽器,蘋果手機瀏覽器的訪問。部署在雲伺服器上,以守護程序的方式執行。

主要分為5個模組:

l  爬蟲模組

l  後台伺服器模組

使用epoll邊緣觸發,執行緒池,多執行緒非同步日誌。使用簡單的html,支援get和post。

l  資料庫模組

使用mysql資料庫管理新聞資訊,使用者身份資訊,使用者訪問記錄。

l  搜尋模組

使用mysql5.7新增的全文索引,並且通過c++多執行緒呼叫python程式,對檢索結果使用bm25演算法進行相關度排序。

l  推薦模組

1、 後台伺服器的搭建,這是最主要的問題。

目前是採用的方案是主線程接受連線,對資料進行讀,讀完之後將請求的任務分給執行緒池中的執行緒去做,執行緒池中的執行緒處理完之後,讓主線程去寫。這種方案對主線程的負擔比較大,不適合處理高併發的請求。改進方案是採用經典的one thread per loop方案,主線程只負責連線的建立,然後將這個連線以roundrobin的方式分攤給執行緒池的執行緒,此後這個執行緒就全權接管這個連線。

一開始我就使用的效能比較高的epoll加邊緣觸發的方式。但是由於對epoll和非阻塞讀寫的理解沒有到位,程式出現了很多bug。印象最深的是我採用條件變數搭建的執行緒池,主線程接受連線之後讓執行緒池中的執行緒來處理,但是我只註冊了epollin事件,所以導致在對方斷開連線的時候也會觸發乙個可讀事件,當執行緒池中的執行緒去對他進行讀的時候就會出錯。還有我一開始對eagain或者ewouldblock這個錯誤沒有正確的認識,其實忽略它就可以了。

還有accept必須非阻塞,在et模式下必須用while迴圈去接受accept連線。

2、 程式的除錯問題

網路程式設計的程式錯誤一般為執行期的錯誤。並且我們的系統有一部分是呼叫的python程式,程式執行到python**時如果有錯,能給我們的出錯資訊很少。這給除錯帶來了很大的麻煩,必須讓伺服器執行起來,讓使用者去訪問,看看**出錯了。由於是在雲伺服器上搭建的http伺服器,終端退出之後需要http伺服器還能執行,所以需要設定守護程序,並且啟用日誌系統記錄系統的關鍵資訊。總的來說,除錯的方式有:

全域性變數errno

assert斷言

終端輸出

打日誌程式崩潰檢視core dump檔案

使用gdb除錯

3、 c++多執行緒呼叫python的過程中出現的gil極大地影響程式的效能

一開始只能搜尋一次,搜尋完之後搜尋第二次就一直卡住。後來多方求證,終於找到問題的所在,就是在多執行緒環境下,python程式執行需要有gil鎖,用完之後必須釋放,否則會造成死鎖的情況。

4、建立全文索引之後極大地影響資料庫的插入效能,導致爬蟲效率低下。(一開始我還以為是我的ip被**封了,直到我用慢查詢日誌抓出每條插入語句都是慢查詢。)刪掉索引又是不行的,因為我們需要索引來檢索,來保證爬蟲的時候存入資料庫中的新聞是沒有重複的。目前準備採用的方案是爬蟲程式儲存到另乙個資料庫中,這個資料庫是沒有索引的,伺服器訪問的資料庫是有索引的,爬蟲的時候先檢索伺服器訪問的資料庫,如果資料庫中沒有記錄,就存到沒有索引的那個資料庫中。一段時間之後刪除伺服器訪問的那個資料庫上的索引,將另乙個資料庫中的資料匯入之後再建立索引。基本的思路如圖:

Linux平台下程式記憶體的分配

程式記憶體分配 1.棧區 stack 由編譯器自動分配釋放,存放為執行函式而分配的區域性變數,函式引數,返回引數,返回位址。其操作方式類似於資料結構中的棧。2.堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 分配方式類似於鍊錶。3.全域性資料區 存放全域性變數,靜...

Linux平台下QT環境的搭建

qt library 4.8.1 qt creator 2.4.1 ubuntu18.04 安裝g sudo apt get install g sudo apt get install libx11 dev libxext dev libxtst dev cd qt everywhere open...

Linux平台下 c檔案的編輯和執行命令

linux平台下.c檔案的編輯和執行命令 1.首先要建立乙個 c檔案 輸入命令 touch test.c 我在這裡建立乙個 test.c 檔案 開始寫 輸入命令 vim test.c 前提是你已經安裝了vim文字編輯器 退出文字文件 按一下esc 然後按出 冒號接著輸入對應字母 輸入字母 q 表示退...