python_threading_processing

【Python教學】淺談 Multi-processing & Multi-threading 使用方法

發佈於 4 則留言分類: 03 Python 爬蟲教學10 所有文章

一. Multi-processing 和Multi-threading 的優缺點: Multi-processing (多處理程序/多進程): 資料在彼此間傳遞變得更加複雜及花時間,因為一個 process 在作業系統的管理下是無法去存取別的 process 的 memory 適合需要 CPU 密集,像是迴圈計算 Multi-threading (多執行緒/多線程): 資料彼此傳遞簡單,因為多執行緒的 memory 之間是共用的,但也因此要避免會有 Race Condition 問題 適合需要 I/O 密集,像是爬蟲需要時間等待 request 回覆 關於多執行緒在 Python 中受 GIL 的限制,推薦延伸閱讀:【Python教學】淺談 GIL & Thread-safe &a […]

python_gil_thread-saf_atomic

【Python教學】淺談 GIL & Thread-safe & Atomic operation

發佈於 發佈留言分類: 02 Python 基礎教學03 Python 爬蟲教學10 所有文章

本篇整理了關於 Python 為什麼會有 GIL 的出現、thread-safe 問題探討、以及 GIL 切換時機、和確保 thread-safe 的原子操作概念 (atomic operation),此篇未來會持續更新,希望對在了解 GIL 的你有幫助~ 一. 為什麼會有 GIL 的出現? In CPython, the global interpreter lock, or GIL, is a mutex that protects access to Python objects, preventing multiple threads from executing Python bytecodes at once. This lock is necessary mainly beca […]

python_selenium_driver

【爬蟲教學】如何讓 Selenium 多線池執行時 driver 不會重複開啟

發佈於 3 則留言分類: 03 Python 爬蟲教學10 所有文章

本篇主要紀錄使用 Selenium 搭配 Multi-threading Pool (多執行緒池/多線程池) 遇到 web driver 會重複開啟和關閉的問題,導致效率大幅下降,解決方法是使用 threading.local 將 driver 變數存 local 來判斷是否有需要重複開啟 使用 threading.local() 利用 threading.local() 的方法將 driver 變數存在 thread 線程內,當每次 thread 線程重新執行時會先 getattr 看看有無 driver 沒有的話就會重新開啟。 import threadingthreadLocal = threading.local()def get_driver(): driver = getattr […]

multithreadpool

【Python教學】淺談 Multi-threading Pool 使用方法

發佈於 發佈留言分類: 03 Python 爬蟲教學10 所有文章

先來看一下執行 Multi-threading Pool (多執行緒池/多線程池) 後,可以將每一個頁面原本需要等待 15 s 才能載入完畢並爬取的頁面,降至 3.9 秒 (10 threading pool) ~ 2.28 秒(25 threading pool),但是多線程池的使用要非常留意 tread-safe 問題 ,不小心就會像上面圖片一樣,想像中大家是各自完成任務,但實際上是亂七八糟的執行任務。 Multi-threading Pool 實現方法一 首先install threadpool,這是個最後更新時間在2015年的套件目前已經沒有人維護了,但使用起來相當簡單和方便,目前python3.7版本使用上沒有問題。 pip install threadpool 多線池程 […]

python_selenium_error

【爬蟲筆記】Python Selenium Webdriver異常問題集

發佈於 1 則留言分類: 03 Python 爬蟲教學10 所有文章

在開發 Python Selenium 爬蟲遇到了不少坑,花了很多時間找問題和解決方法,所以記錄一下,希望遇到相同問題的人有幫助 Python Selenium Webdriver 異常記錄 發生 selenium.common.exceptions.TimeoutException 問題: 可以在 driver 這邊設定 timeout 超時時間 driver.set_page_load_timeout(110) try: “do something”except TimeoutException as e: driver.close() driver.quit() time.sleep(10) break  發生 ConnectionResetError: [Errno 104 […]