『壹』 python 線程池的使用
最近在做一個爬蟲相關的項目,單線程的整站爬蟲,耗時真的不是一般的巨大,運行一次也是心累,,,所以,要想實現整站爬蟲,多線程是不可避免的,那麼python多線程又應該怎樣實現呢?這里主要要幾個問題(關於python多線程的GIL問題就不再說了,網上太多了)。
一、 既然多線程可以縮短程序運行時間,那麼,是不是線程數量越多越好呢?
顯然,並不是,每一個線程的從生成到消亡也是需要時間和資源的,太多的線程會佔用過多的系統資源(內存開銷,cpu開銷),而且生成太多的線程時間也是可觀的,很可能會得不償失,這里給出一個最佳線程數量的計算方式:
最佳線程數的獲取:
1、通過用戶慢慢遞增來進行性能壓測,觀察QPS(即每秒的響應請求數,也即是最大吞吐能力。),響應時間
2、根據公式計算:伺服器端最佳線程數量=((線程等待時間+線程cpu時間)/線程cpu時間) * cpu數量
3、單用戶壓測,查看CPU的消耗,然後直接乘以百分比,再進行壓測,一般這個值的附近應該就是最佳線程數量。
二、為什麼要使用線程池?
對於任務數量不斷增加的程序,每有一個任務就生成一個線程,最終會導致線程數量的失控,例如,整站爬蟲,假設初始只有一個鏈接a,那麼,這個時候只啟動一個線程,運行之後,得到這個鏈接對應頁面上的b,c,d,,,等等新的鏈接,作為新任務,這個時候,就要為這些新的鏈接生成新的線程,線程數量暴漲。在之後的運行中,線程數量還會不停的增加,完全無法控制。所以,對於任務數量不端增加的程序,固定線程數量的線程池是必要的。
三、如何使用線程池
過去使用threadpool模塊,現在一般使用concurrent.futures模塊,這個模塊是python3中自帶的模塊,但是,python2.7以上版本也可以安裝使用,具體使用方式如下:
注意到:
concurrent.futures.ThreadPoolExecutor,在提交任務的時候,有兩種方式,一種是submit()函數,另一種是map()函數,兩者的主要區別在於:
『貳』 python需要設置哪些環境變數我只知道一個PYTHONHOME指向安裝目錄。
1、首先,右鍵點擊-計算機(此電腦),點擊進入屬性,如圖所示。
『叄』 Python安裝PyQt5時遇到這個問題該怎麼解決
linux系統下Qt5編譯好的程序在未安裝Qt的系統下運行會報以下錯誤:
This application failed to start because it could not find or load the Qt platform plugin "xcb".
Reinstalling the application may fix this problem.
出現這個錯誤,主要是因為qt5為了在多平台下更方便移植,使用了一種新的技術-----platform abstraction system (QPA),而它中的庫又依賴於Qt5中的一個庫文件libQt5DBus.so.5,所以,只要打包時只要加上這個文件就可以了。
linux下qt5程序打包步驟如下
1、把以下7個庫文件放到/usr/lib目錄下
libQt5Widgets.so.5
libQt5Gui.so.5
libQt5Core.so.5
libicui18n.so.51
libicuuc.so.51
libicudata.so.51
libQt5DBus.so.5
2、拷貝Qt5安裝目錄中的platforms目錄,使它和你的Qt程序同級目錄
現在你可以雙擊你的程序運行了呵呵
『肆』 python多線程thread.start_new_thread傳參的問題
因為thread.start_new_thread(ssh_cmd,(3,))開的線程會和主線程一起結束,所以等不到執行print number 程序就結束了
『伍』 python threading模塊,生成多線程之後,怎麼得到線程執行完成後return出的字元串呢
多線程/多進程都是通訊或者回調,而不是直接返回結果。這個很容易理解的,因為如果你用返回結果來給一個變數賦值,你就必須等待這個函數結束,你這個程序就阻塞了,這就失去了多線程/多進程防止阻塞的意義了。
通訊可以是事件驅動或者用線程安全的數據結構來傳遞數據(比如Queue,也可以是消息隊列0mq,rabbitMQ之類),回調就是你一個程序執行完成後調用另外一個函數來處理接下來怎麼做。