'為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?'

"

歡迎各位小哥哥小姐姐閱讀本<小生>的文章,對大家學習有幫助,請點贊加關注哦!!!!!!!!!!

您的點贊和關注將是我持續更新的動力呢.^v^

有不懂的問題可以私聊我哦!

問題:

  • 1、Python 多線程為什麼耗時更長?
  • 2、為什麼在 Python 裡面推薦使用多進程而不是多線程?

1.1創建多線程

Python提供兩個模塊進行多線程的操作,分別是thread和threading,

前者是比較低級的模塊,用於更底層的操作,一般應用級別的開發不常用。

  • 方法1:直接使用threading.Thread()
"

歡迎各位小哥哥小姐姐閱讀本<小生>的文章,對大家學習有幫助,請點贊加關注哦!!!!!!!!!!

您的點贊和關注將是我持續更新的動力呢.^v^

有不懂的問題可以私聊我哦!

問題:

  • 1、Python 多線程為什麼耗時更長?
  • 2、為什麼在 Python 裡面推薦使用多進程而不是多線程?

1.1創建多線程

Python提供兩個模塊進行多線程的操作,分別是thread和threading,

前者是比較低級的模塊,用於更底層的操作,一般應用級別的開發不常用。

  • 方法1:直接使用threading.Thread()
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承threading.Thread來自定義線程類,重寫run方法
"

歡迎各位小哥哥小姐姐閱讀本<小生>的文章,對大家學習有幫助,請點贊加關注哦!!!!!!!!!!

您的點贊和關注將是我持續更新的動力呢.^v^

有不懂的問題可以私聊我哦!

問題:

  • 1、Python 多線程為什麼耗時更長?
  • 2、為什麼在 Python 裡面推薦使用多進程而不是多線程?

1.1創建多線程

Python提供兩個模塊進行多線程的操作,分別是thread和threading,

前者是比較低級的模塊,用於更底層的操作,一般應用級別的開發不常用。

  • 方法1:直接使用threading.Thread()
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承threading.Thread來自定義線程類,重寫run方法
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.2 線程合併

Join函數執行順序是逐個執行每個線程,執行完畢後繼續往下執行。主線程結束後,子線程還在運行,join函數使得主線程等到子線程結束時才退出。

"

歡迎各位小哥哥小姐姐閱讀本<小生>的文章,對大家學習有幫助,請點贊加關注哦!!!!!!!!!!

您的點贊和關注將是我持續更新的動力呢.^v^

有不懂的問題可以私聊我哦!

問題:

  • 1、Python 多線程為什麼耗時更長?
  • 2、為什麼在 Python 裡面推薦使用多進程而不是多線程?

1.1創建多線程

Python提供兩個模塊進行多線程的操作,分別是thread和threading,

前者是比較低級的模塊,用於更底層的操作,一般應用級別的開發不常用。

  • 方法1:直接使用threading.Thread()
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承threading.Thread來自定義線程類,重寫run方法
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.2 線程合併

Join函數執行順序是逐個執行每個線程,執行完畢後繼續往下執行。主線程結束後,子線程還在運行,join函數使得主線程等到子線程結束時才退出。

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.3 線程同步與互斥鎖

線程之間數據共享的。當多個線程對某一個共享數據進行操作時,就需要考慮到線程安全問題。threading模塊中定義了Lock 類,提供了互斥鎖的功能來保證多線程情況下數據的正確性。

用法的基本步驟:

"

歡迎各位小哥哥小姐姐閱讀本<小生>的文章,對大家學習有幫助,請點贊加關注哦!!!!!!!!!!

您的點贊和關注將是我持續更新的動力呢.^v^

有不懂的問題可以私聊我哦!

問題:

  • 1、Python 多線程為什麼耗時更長?
  • 2、為什麼在 Python 裡面推薦使用多進程而不是多線程?

1.1創建多線程

Python提供兩個模塊進行多線程的操作,分別是thread和threading,

前者是比較低級的模塊,用於更底層的操作,一般應用級別的開發不常用。

  • 方法1:直接使用threading.Thread()
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承threading.Thread來自定義線程類,重寫run方法
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.2 線程合併

Join函數執行順序是逐個執行每個線程,執行完畢後繼續往下執行。主線程結束後,子線程還在運行,join函數使得主線程等到子線程結束時才退出。

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.3 線程同步與互斥鎖

線程之間數據共享的。當多個線程對某一個共享數據進行操作時,就需要考慮到線程安全問題。threading模塊中定義了Lock 類,提供了互斥鎖的功能來保證多線程情況下數據的正確性。

用法的基本步驟:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

其中,鎖定方法acquire可以有一個超時時間的可選參數timeout。如果設定了timeout,則在超時後通過返回值可以判斷是否得到了鎖,從而可以進行一些其他的處理。

具體用法見示例代碼:

"

歡迎各位小哥哥小姐姐閱讀本<小生>的文章,對大家學習有幫助,請點贊加關注哦!!!!!!!!!!

您的點贊和關注將是我持續更新的動力呢.^v^

有不懂的問題可以私聊我哦!

問題:

  • 1、Python 多線程為什麼耗時更長?
  • 2、為什麼在 Python 裡面推薦使用多進程而不是多線程?

1.1創建多線程

Python提供兩個模塊進行多線程的操作,分別是thread和threading,

前者是比較低級的模塊,用於更底層的操作,一般應用級別的開發不常用。

  • 方法1:直接使用threading.Thread()
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承threading.Thread來自定義線程類,重寫run方法
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.2 線程合併

Join函數執行順序是逐個執行每個線程,執行完畢後繼續往下執行。主線程結束後,子線程還在運行,join函數使得主線程等到子線程結束時才退出。

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.3 線程同步與互斥鎖

線程之間數據共享的。當多個線程對某一個共享數據進行操作時,就需要考慮到線程安全問題。threading模塊中定義了Lock 類,提供了互斥鎖的功能來保證多線程情況下數據的正確性。

用法的基本步驟:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

其中,鎖定方法acquire可以有一個超時時間的可選參數timeout。如果設定了timeout,則在超時後通過返回值可以判斷是否得到了鎖,從而可以進行一些其他的處理。

具體用法見示例代碼:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.4 可重入鎖(遞歸鎖)

為了滿足在同一線程中多次請求同一資源的需求,Python 提供了可重入鎖(RLock)。

RLock內部維護著一個Lock和一個counter變量,counter 記錄了 acquire 的次數,從而使得資源可以被多次 require。直到一個線程所有的 acquire 都被 release,其他的線程才能獲得資源。

具體用法如下:

"

歡迎各位小哥哥小姐姐閱讀本<小生>的文章,對大家學習有幫助,請點贊加關注哦!!!!!!!!!!

您的點贊和關注將是我持續更新的動力呢.^v^

有不懂的問題可以私聊我哦!

問題:

  • 1、Python 多線程為什麼耗時更長?
  • 2、為什麼在 Python 裡面推薦使用多進程而不是多線程?

1.1創建多線程

Python提供兩個模塊進行多線程的操作,分別是thread和threading,

前者是比較低級的模塊,用於更底層的操作,一般應用級別的開發不常用。

  • 方法1:直接使用threading.Thread()
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承threading.Thread來自定義線程類,重寫run方法
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.2 線程合併

Join函數執行順序是逐個執行每個線程,執行完畢後繼續往下執行。主線程結束後,子線程還在運行,join函數使得主線程等到子線程結束時才退出。

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.3 線程同步與互斥鎖

線程之間數據共享的。當多個線程對某一個共享數據進行操作時,就需要考慮到線程安全問題。threading模塊中定義了Lock 類,提供了互斥鎖的功能來保證多線程情況下數據的正確性。

用法的基本步驟:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

其中,鎖定方法acquire可以有一個超時時間的可選參數timeout。如果設定了timeout,則在超時後通過返回值可以判斷是否得到了鎖,從而可以進行一些其他的處理。

具體用法見示例代碼:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.4 可重入鎖(遞歸鎖)

為了滿足在同一線程中多次請求同一資源的需求,Python 提供了可重入鎖(RLock)。

RLock內部維護著一個Lock和一個counter變量,counter 記錄了 acquire 的次數,從而使得資源可以被多次 require。直到一個線程所有的 acquire 都被 release,其他的線程才能獲得資源。

具體用法如下:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.5 守護線程

如果希望主線程執行完畢之後,不管子線程是否執行完畢都隨著主線程一起結束。我們可以使用setDaemon(bool)函數,它跟join函數是相反的。它的作用是設置子線程是否隨主線程一起結束,必須在start() 之前調用,默認為False。

1.6 定時器

如果需要規定函數在多少秒後執行某個操作,需要用到Timer類。具體用法如下:

"

歡迎各位小哥哥小姐姐閱讀本<小生>的文章,對大家學習有幫助,請點贊加關注哦!!!!!!!!!!

您的點贊和關注將是我持續更新的動力呢.^v^

有不懂的問題可以私聊我哦!

問題:

  • 1、Python 多線程為什麼耗時更長?
  • 2、為什麼在 Python 裡面推薦使用多進程而不是多線程?

1.1創建多線程

Python提供兩個模塊進行多線程的操作,分別是thread和threading,

前者是比較低級的模塊,用於更底層的操作,一般應用級別的開發不常用。

  • 方法1:直接使用threading.Thread()
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承threading.Thread來自定義線程類,重寫run方法
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.2 線程合併

Join函數執行順序是逐個執行每個線程,執行完畢後繼續往下執行。主線程結束後,子線程還在運行,join函數使得主線程等到子線程結束時才退出。

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.3 線程同步與互斥鎖

線程之間數據共享的。當多個線程對某一個共享數據進行操作時,就需要考慮到線程安全問題。threading模塊中定義了Lock 類,提供了互斥鎖的功能來保證多線程情況下數據的正確性。

用法的基本步驟:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

其中,鎖定方法acquire可以有一個超時時間的可選參數timeout。如果設定了timeout,則在超時後通過返回值可以判斷是否得到了鎖,從而可以進行一些其他的處理。

具體用法見示例代碼:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.4 可重入鎖(遞歸鎖)

為了滿足在同一線程中多次請求同一資源的需求,Python 提供了可重入鎖(RLock)。

RLock內部維護著一個Lock和一個counter變量,counter 記錄了 acquire 的次數,從而使得資源可以被多次 require。直到一個線程所有的 acquire 都被 release,其他的線程才能獲得資源。

具體用法如下:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.5 守護線程

如果希望主線程執行完畢之後,不管子線程是否執行完畢都隨著主線程一起結束。我們可以使用setDaemon(bool)函數,它跟join函數是相反的。它的作用是設置子線程是否隨主線程一起結束,必須在start() 之前調用,默認為False。

1.6 定時器

如果需要規定函數在多少秒後執行某個操作,需要用到Timer類。具體用法如下:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

2 Python 多進程

2.1 創建多進程

Python 要進行多進程操作,需要用到muiltprocessing庫,其中的Process類跟threading模塊的Thread類很相似。所以直接看代碼熟悉多進程。

  • 方法1:直接使用Process, 代碼如下:
"

歡迎各位小哥哥小姐姐閱讀本<小生>的文章,對大家學習有幫助,請點贊加關注哦!!!!!!!!!!

您的點贊和關注將是我持續更新的動力呢.^v^

有不懂的問題可以私聊我哦!

問題:

  • 1、Python 多線程為什麼耗時更長?
  • 2、為什麼在 Python 裡面推薦使用多進程而不是多線程?

1.1創建多線程

Python提供兩個模塊進行多線程的操作,分別是thread和threading,

前者是比較低級的模塊,用於更底層的操作,一般應用級別的開發不常用。

  • 方法1:直接使用threading.Thread()
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承threading.Thread來自定義線程類,重寫run方法
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.2 線程合併

Join函數執行順序是逐個執行每個線程,執行完畢後繼續往下執行。主線程結束後,子線程還在運行,join函數使得主線程等到子線程結束時才退出。

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.3 線程同步與互斥鎖

線程之間數據共享的。當多個線程對某一個共享數據進行操作時,就需要考慮到線程安全問題。threading模塊中定義了Lock 類,提供了互斥鎖的功能來保證多線程情況下數據的正確性。

用法的基本步驟:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

其中,鎖定方法acquire可以有一個超時時間的可選參數timeout。如果設定了timeout,則在超時後通過返回值可以判斷是否得到了鎖,從而可以進行一些其他的處理。

具體用法見示例代碼:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.4 可重入鎖(遞歸鎖)

為了滿足在同一線程中多次請求同一資源的需求,Python 提供了可重入鎖(RLock)。

RLock內部維護著一個Lock和一個counter變量,counter 記錄了 acquire 的次數,從而使得資源可以被多次 require。直到一個線程所有的 acquire 都被 release,其他的線程才能獲得資源。

具體用法如下:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.5 守護線程

如果希望主線程執行完畢之後,不管子線程是否執行完畢都隨著主線程一起結束。我們可以使用setDaemon(bool)函數,它跟join函數是相反的。它的作用是設置子線程是否隨主線程一起結束,必須在start() 之前調用,默認為False。

1.6 定時器

如果需要規定函數在多少秒後執行某個操作,需要用到Timer類。具體用法如下:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

2 Python 多進程

2.1 創建多進程

Python 要進行多進程操作,需要用到muiltprocessing庫,其中的Process類跟threading模塊的Thread類很相似。所以直接看代碼熟悉多進程。

  • 方法1:直接使用Process, 代碼如下:
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承Process來自定義進程類,重寫run方法, 代碼如下:
"

歡迎各位小哥哥小姐姐閱讀本<小生>的文章,對大家學習有幫助,請點贊加關注哦!!!!!!!!!!

您的點贊和關注將是我持續更新的動力呢.^v^

有不懂的問題可以私聊我哦!

問題:

  • 1、Python 多線程為什麼耗時更長?
  • 2、為什麼在 Python 裡面推薦使用多進程而不是多線程?

1.1創建多線程

Python提供兩個模塊進行多線程的操作,分別是thread和threading,

前者是比較低級的模塊,用於更底層的操作,一般應用級別的開發不常用。

  • 方法1:直接使用threading.Thread()
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承threading.Thread來自定義線程類,重寫run方法
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.2 線程合併

Join函數執行順序是逐個執行每個線程,執行完畢後繼續往下執行。主線程結束後,子線程還在運行,join函數使得主線程等到子線程結束時才退出。

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.3 線程同步與互斥鎖

線程之間數據共享的。當多個線程對某一個共享數據進行操作時,就需要考慮到線程安全問題。threading模塊中定義了Lock 類,提供了互斥鎖的功能來保證多線程情況下數據的正確性。

用法的基本步驟:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

其中,鎖定方法acquire可以有一個超時時間的可選參數timeout。如果設定了timeout,則在超時後通過返回值可以判斷是否得到了鎖,從而可以進行一些其他的處理。

具體用法見示例代碼:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.4 可重入鎖(遞歸鎖)

為了滿足在同一線程中多次請求同一資源的需求,Python 提供了可重入鎖(RLock)。

RLock內部維護著一個Lock和一個counter變量,counter 記錄了 acquire 的次數,從而使得資源可以被多次 require。直到一個線程所有的 acquire 都被 release,其他的線程才能獲得資源。

具體用法如下:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.5 守護線程

如果希望主線程執行完畢之後,不管子線程是否執行完畢都隨著主線程一起結束。我們可以使用setDaemon(bool)函數,它跟join函數是相反的。它的作用是設置子線程是否隨主線程一起結束,必須在start() 之前調用,默認為False。

1.6 定時器

如果需要規定函數在多少秒後執行某個操作,需要用到Timer類。具體用法如下:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

2 Python 多進程

2.1 創建多進程

Python 要進行多進程操作,需要用到muiltprocessing庫,其中的Process類跟threading模塊的Thread類很相似。所以直接看代碼熟悉多進程。

  • 方法1:直接使用Process, 代碼如下:
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承Process來自定義進程類,重寫run方法, 代碼如下:
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

2.2 多進程通信

進程之間不共享數據的。如果進程之間需要進行通信,則要用到Queue模塊或者Pipi模塊來實現。

2.3 進程池

創建多個進程,我們不用傻傻地一個個去創建。我們可以使用Pool模塊來搞定。

Pool 常用的方法如下:

"

歡迎各位小哥哥小姐姐閱讀本<小生>的文章,對大家學習有幫助,請點贊加關注哦!!!!!!!!!!

您的點贊和關注將是我持續更新的動力呢.^v^

有不懂的問題可以私聊我哦!

問題:

  • 1、Python 多線程為什麼耗時更長?
  • 2、為什麼在 Python 裡面推薦使用多進程而不是多線程?

1.1創建多線程

Python提供兩個模塊進行多線程的操作,分別是thread和threading,

前者是比較低級的模塊,用於更底層的操作,一般應用級別的開發不常用。

  • 方法1:直接使用threading.Thread()
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承threading.Thread來自定義線程類,重寫run方法
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.2 線程合併

Join函數執行順序是逐個執行每個線程,執行完畢後繼續往下執行。主線程結束後,子線程還在運行,join函數使得主線程等到子線程結束時才退出。

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.3 線程同步與互斥鎖

線程之間數據共享的。當多個線程對某一個共享數據進行操作時,就需要考慮到線程安全問題。threading模塊中定義了Lock 類,提供了互斥鎖的功能來保證多線程情況下數據的正確性。

用法的基本步驟:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

其中,鎖定方法acquire可以有一個超時時間的可選參數timeout。如果設定了timeout,則在超時後通過返回值可以判斷是否得到了鎖,從而可以進行一些其他的處理。

具體用法見示例代碼:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.4 可重入鎖(遞歸鎖)

為了滿足在同一線程中多次請求同一資源的需求,Python 提供了可重入鎖(RLock)。

RLock內部維護著一個Lock和一個counter變量,counter 記錄了 acquire 的次數,從而使得資源可以被多次 require。直到一個線程所有的 acquire 都被 release,其他的線程才能獲得資源。

具體用法如下:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.5 守護線程

如果希望主線程執行完畢之後,不管子線程是否執行完畢都隨著主線程一起結束。我們可以使用setDaemon(bool)函數,它跟join函數是相反的。它的作用是設置子線程是否隨主線程一起結束,必須在start() 之前調用,默認為False。

1.6 定時器

如果需要規定函數在多少秒後執行某個操作,需要用到Timer類。具體用法如下:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

2 Python 多進程

2.1 創建多進程

Python 要進行多進程操作,需要用到muiltprocessing庫,其中的Process類跟threading模塊的Thread類很相似。所以直接看代碼熟悉多進程。

  • 方法1:直接使用Process, 代碼如下:
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承Process來自定義進程類,重寫run方法, 代碼如下:
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

2.2 多進程通信

進程之間不共享數據的。如果進程之間需要進行通信,則要用到Queue模塊或者Pipi模塊來實現。

2.3 進程池

創建多個進程,我們不用傻傻地一個個去創建。我們可以使用Pool模塊來搞定。

Pool 常用的方法如下:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

具體用法見示例代碼:

"

歡迎各位小哥哥小姐姐閱讀本<小生>的文章,對大家學習有幫助,請點贊加關注哦!!!!!!!!!!

您的點贊和關注將是我持續更新的動力呢.^v^

有不懂的問題可以私聊我哦!

問題:

  • 1、Python 多線程為什麼耗時更長?
  • 2、為什麼在 Python 裡面推薦使用多進程而不是多線程?

1.1創建多線程

Python提供兩個模塊進行多線程的操作,分別是thread和threading,

前者是比較低級的模塊,用於更底層的操作,一般應用級別的開發不常用。

  • 方法1:直接使用threading.Thread()
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承threading.Thread來自定義線程類,重寫run方法
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.2 線程合併

Join函數執行順序是逐個執行每個線程,執行完畢後繼續往下執行。主線程結束後,子線程還在運行,join函數使得主線程等到子線程結束時才退出。

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.3 線程同步與互斥鎖

線程之間數據共享的。當多個線程對某一個共享數據進行操作時,就需要考慮到線程安全問題。threading模塊中定義了Lock 類,提供了互斥鎖的功能來保證多線程情況下數據的正確性。

用法的基本步驟:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

其中,鎖定方法acquire可以有一個超時時間的可選參數timeout。如果設定了timeout,則在超時後通過返回值可以判斷是否得到了鎖,從而可以進行一些其他的處理。

具體用法見示例代碼:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.4 可重入鎖(遞歸鎖)

為了滿足在同一線程中多次請求同一資源的需求,Python 提供了可重入鎖(RLock)。

RLock內部維護著一個Lock和一個counter變量,counter 記錄了 acquire 的次數,從而使得資源可以被多次 require。直到一個線程所有的 acquire 都被 release,其他的線程才能獲得資源。

具體用法如下:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

1.5 守護線程

如果希望主線程執行完畢之後,不管子線程是否執行完畢都隨著主線程一起結束。我們可以使用setDaemon(bool)函數,它跟join函數是相反的。它的作用是設置子線程是否隨主線程一起結束,必須在start() 之前調用,默認為False。

1.6 定時器

如果需要規定函數在多少秒後執行某個操作,需要用到Timer類。具體用法如下:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

2 Python 多進程

2.1 創建多進程

Python 要進行多進程操作,需要用到muiltprocessing庫,其中的Process類跟threading模塊的Thread類很相似。所以直接看代碼熟悉多進程。

  • 方法1:直接使用Process, 代碼如下:
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

  • 方法2:繼承Process來自定義進程類,重寫run方法, 代碼如下:
為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

2.2 多進程通信

進程之間不共享數據的。如果進程之間需要進行通信,則要用到Queue模塊或者Pipi模塊來實現。

2.3 進程池

創建多個進程,我們不用傻傻地一個個去創建。我們可以使用Pool模塊來搞定。

Pool 常用的方法如下:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

具體用法見示例代碼:

為什麼有人說 Python 的多線程是雞肋?不是真正意義上的多線程?

選擇多線程還是多進程?

在這個問題上,首先要看下你的程序是屬於哪種類型的。一般分為兩種 CPU 密集型 和 I/O 密集型。

  • CPU 密集型:程序比較偏重於計算,需要經常使用 CPU 來運算。例如科學計算的程序,機器學習的程序等。
  • I/O 密集型:顧名思義就是程序需要頻繁進行輸入輸出操作。爬蟲程序就是典型的 I/O 密集型程序。

如果程序是屬於 CPU 密集型,建議使用多進程。而多線程就更適合應用於 I/O 密集型程序。

最後多說一句,小編是一名python開發工程師,這裡有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習等。想要這些資料的可以關注小編,並在後臺私信小編:“01”即可領取。

"

相關推薦

推薦中...