使用直接呼叫檔案入口作為程式的起點
if__name__ =="__main__":
main()
注意,這一句並不代表如果該if之前有其他直接暴露出來的**時,他會首先執行。
該if語句只是代表順序執行到這句話時進行判斷呼叫者是誰,若是直接執行的該檔案,則進入結構,若是其他檔案呼叫,那就跳過。
多執行緒仔細想想就可以發現,其實爬10頁(每頁25本),這10頁爬的先後關係是無所謂的,因為寫入的時候沒有依賴關係,各寫各的,所以用序列方式爬取是吃虧的。顯然可以用併發來加快速度,而且由於沒有同步互斥關係,所以連鎖都不用上。
正如引用博文所說,由於問題的特殊性,我用了與之相似的較為直接的直接分配給各個執行緒不同的任務,而避免了執行緒互動導致的其他問題。
我的**中多執行緒的核心**不多,見下。
呼叫執行緒庫threading,向threading.thread()類中傳入要用執行緒執行的函式及其引數。
執行緒列表依次新增對應不同引數的執行緒,pagelist[i],step兩個引數是關鍵,我是分別為每個執行緒分配了不同的頁面鏈結,這個地方我想了半天,最終使用了一些數學計算來處理了一下。
同時也簡單試用了下列表生成式:
pagelist = [x for x in range(0, pagenum, step)]
這個和下面是一致的:
threading.thread的幾個方法
值得參考:多執行緒
start() 啟動執行緒
jion([timeout]),依次檢驗執行緒池中的執行緒是否結束,沒有結束就阻塞直到執行緒結束,如果結束則跳轉執行下乙個執行緒的join函式。在程式中,最後join()方法使得當所呼叫執行緒都執行完畢後,主線程才會執行下面的**。相當於實現了乙個結束上的同步。這樣避免了前面的執行緒結束任務時,導致檔案關閉。
注意使用多執行緒時,期間的延時時間應該設定的大些,不然會被**拒絕訪問,這時你還得去豆瓣認證下"我真的不是機械人"(尷尬)。我設定了10s,倒是沒問題,再小些,就會出錯了。
完整**
效率有提公升
對應的單執行緒程式在github上。單執行緒:
可見時間超過30分鐘。修改後時間縮短到了11分鐘。
檔案截圖
元件類原始檔的直接使用
問題 在工程中新建乙個資料夾mycontrols 把cs檔案和resx檔案以及design.cs檔案都新增到該資料夾去 別忘了把cs檔案中需要呼叫的bmp檔案新增到工程的resources資料夾下 在程式中 using mycontrols typea controla new typea cont...
C 直接呼叫IE開啟指定的網頁檔案
之前在一級的專案中遇到了乙個問題,就是其他的系統需要用谷歌的瀏覽器作為支援,而我們的系統是需要ie瀏覽器做支援的,另外我們的頁面都是在本地的所以可以由指定瀏覽器開啟,所以有了這個研究,這對於軟體和系統的支援也有很多幫助。一 所需環境 net環境 需要引用system.diagnostics這個命名空...
檢視呼叫DLL的程式及Kill DLL檔案
以server.dll為例。如果想刪除這個dll檔案,可是系統告訴你使用中,首先要知道什麼程式在使用這個dll檔案。開始 執行 cmd 輸入命令 tasklist m c 1.txt 命令執行完成後,在c盤下找到1.txt這個檔案,ctrl f查詢dll名字,這裡是server 這樣就能看到是哪個程...