當前位置:首頁 » 編程語言 » 線程池python

線程池python

發布時間: 2022-02-07 22:45:14

『壹』 為什麼有人說 python 的多線程是雞肋

因為 Python 中臭名昭著的 GIL。

那麼 GIL 是什麼?為什麼會有 GIL?多線程真的是雞肋嗎? GIL 可以去掉嗎?帶著這些問題,我們一起往下看,同時需要你有一點點耐心。

多線程是不是雞肋,我們先做個實驗,實驗非常簡單,就是將數字 「1億」 遞減,減到 0 程序就終止,這個任務如果我們使用單線程來執行,完成時間會是多少?使用多線程又會是多少?show me the code

那麼把 GIL 去掉可行嗎?

還真有人這么干多,但是結果令人失望,在1999年Greg Stein 和Mark Hammond 兩位哥們就創建了一個去掉 GIL 的 Python 分支,在所有可變數據結構上把 GIL 替換為更為細粒度的鎖。然而,做過了基準測試之後,去掉GIL的 Python 在單線程條件下執行效率將近慢了2倍。

Python之父表示:基於以上的考慮,去掉GIL沒有太大的價值而不必花太多精力。

『貳』 python 線程池 全局數組 長時間運行 會崩潰嗎

我第一次看見python代碼里用中文做變數名的,看了下你的代碼,修改全局變數前不是應該加上global,也就是你的write方法里。忽略上述問題,長時間運行,是不會崩潰的,它沒有引發異常也沒有造成內存泄漏。因此可以長時間正常運行,除非人為中斷

『叄』 Python中的線程池是什麼

多線程的做法是,可以同時創建多個線程放入等待執行的序列中。某個線程執行完畢就將它從序列中移除並銷毀。不然的話,即時創建,然後就一定要等到它銷毀,那這不是多線程,這是單線程.
進程中根據需要,為一些需要慢資源、竟爭性資源的任務創建線程,排除等候執行。
線程需要等待分配,如果短時間建立了多個線程,哪個線程先開始執行,由調度程序決定;
...調度>>>執行>>>循環
當線程執行完畢,銷毀線程。
比如說,下載圖片:我有一個列表,記錄了要下載的300張圖片的URL。每個圖片的來源可能是不同網站(伺服器)。那麼,主循環里只需要創建300個【下載】線程。每個線程負責一個URL的下載任務。
然後,調序程序開始調度:線程1有數據過來了,分配時間片給線程1處理這段數據...線程n執行完畢,銷毀線程n...線程1又有數據過來了,分配時間片給線程1處理這段數據......銷毀線程n,沒有等待中的線程,調度暫停。
於是,所有的圖片下載完了。
這個過程與單線程的不同是,在多線程中,最開始同一時間有300個請求在等待若干個伺服器返回數據,而單線程則總是只有一個請求在等待伺服器返回數據或者正在處理數據,另外299個請求根本不存在。
這才是多線程與單線程最主要的差別:在等待某個資源的時候,把其它資源給別的線程去使用。

『肆』 python進程,線程,協程以及幾種自定義線程池

1.線程和進程:
線程是屬於進程的,線程運行在進程空間內,同一進程所產生的線程共享同一內存空間,當進程退出時該進程所產生的線程都會被強制退出並清除。線程可與屬於同一進程的其它線程共享進程所擁有的全部資源,但是其本身基本上不擁有系統資源,只擁有一點在運行中必不可少的信息(如程序計數器、一組寄存器和棧)。

2.線程、進程與協程:
線程和進程的操作是由程序觸發系統介面,最後的執行者是系統;協程的操作則是程序員
協程存在的意義:對於多線程應用,CPU通過切片的方式來切換線程間的執行,線程切換時需要耗時(保持狀態,下次繼續)。協程,則只使用一個線程,在一個線程中規定某個代碼塊執行順序。
協程的適用場景: 當程序中存在大量不需要CPU的操作時(IO),適用於協程;

『伍』 python線程池設置參數可變嗎

(1)可以控制產生線程的數量。通過預先創建一定數量的工作線程並限制其數量,控制線程對象的內存消耗。(2)降低系統開銷和資源消耗。通過對多個請求重用線程,線程創建、銷毀的開銷被分攤到了多個請求上。另外通過限制線程數量,降低虛擬機在垃圾回收方面的開銷。(3)提高系統響應速度。線程事先已被創建,請求到達時可直接進行處理,消除了因線程創建所帶來的延遲,另外多個線程可並發處理。
 線程池的基本實現方法:
(1)線程池管理器。創建並維護線程池,根據需要調整池的大小,並監控線程泄漏現象。
(2)工作線程。它是一個可以循環執行任務的線程,沒有任務時處於 Wait 狀態,新任務到達時可被喚醒。
(3)任務隊列。它提供一種緩沖機制,用以臨時存放待處理的任務,同時作為並發線程的 monitor 對象。
(4)任務介面。它是每個任務必須實現的介面,工作線程通過該介面調度任務的執行。

『陸』 python 多線程和多進程的區別 mutiprocessing theading

首先你要搞清楚進程和線程的關系:線程是最小的執行單元,而進程由至少一個線程組成。

multiprocessing模塊是一個跨平台版本的多進程模塊。該模塊提供了process類來代表一個進程對象。

Process

構造方法__init__(self, group=None, target=None, name=None, args=(), kwargs={})

參數說明:

group:進程所屬組。基本不用

target:表示調用對象或方法名稱。

args:表示調用對象的位置參數元組。

name:別名

kwargs:表示調用對象的字典。

示例代碼如下:

threading本身就可以創建多個線程:

hreads = []#定義一個線程池

t1 = threading.Thread(target=one,args=(,))#建立一個線程並且賦給t1,這個線程指定調用方法one,並且不帶參數

threads.append(t1)#把t1線程裝到threads線程池裡

t2 = threading.Thread(target=two)

threads.append(t2)

t3 = threading.Thread(target=three)

threads.append(t3)

這時threads這個列表中就有三個線程裝在裡面了。

下面就是運行這個線程池裡面的線程

for t in threads:

用一個for語句遍歷threads里的線程,然後調用start()方法運行

注意t.join()必須放在for語句外面。

『柒』 python 怎麼實現多線程的

線程也就是輕量級的進程,多線程允許一次執行多個線程,Python是多線程語言,它有一個多線程包,GIL也就是全局解釋器鎖,以確保一次執行單個線程,一個線程保存GIL並在將其傳遞給下一個線程之前執行一些操作,也就產生了並行執行的錯覺。

『捌』 python如何實現線程池

#這個類是線程類,用來在主程序中調用生成一個線程。其實線程池就是線程的集合地,
#能夠解決有效統一的管理線程,基本就達到了線程池的目的;
#這一段代碼是我的爬蟲程序中的一部分,希望對你有用。
classSpider(Thread):
def__init__(self,todo_list):
super().__init__()
self.setDaemon(True)
self.todo_list=todo_list
self.stat=IDLE

defis_idle(self):
returnself.stat==IDLE

defrun(self):
whileTrue:
url=self.todo_list.get()

#開始線程工作


#這個函數就是主函數了,
defmain(max_threads):
########這里和上一個函數就是核心代碼了。
#創建N個線程,並啟動
print('Spawnspiders')
spiders=[Spider(todo_list)foriinrange(max_threads)]
forspdinspiders:
spd.start()


#python主運行代碼:
if__name__=='__main__':
main(max_threads)

只能給你這么多解釋了,如果想弄懂,還是要去看看基礎知識的。

另外可以查一下有沒有封裝好的三方庫。

『玖』 python 同步框架中使用線程池是否有意義



簡單地說就是作為可能是僅有的支持多線程的解釋型語言(perl的多線程是殘疾,PHP沒有多線程),Python的多線程是有compromise的,在任意時間只有一個Python解釋器在解釋Python bytecode。

如果你的代碼是CPU密集型,多個線程的代碼很有可能是線性執行的。所以這種情況下多線程是雞肋,效率可能還不如單線程因為有context switch
但是:如果你的代碼是IO密集型,多線程可以明顯提高效率。例如製作爬蟲(我就不明白為什麼Python總和爬蟲聯系在一起…不過也只想起來這個例子…),絕大多數時間爬蟲是在等待socket返回數據。這個時候C代碼里是有release GIL的,最終結果是某個線程等待IO的時候其他線程可以繼續執行。
反過來講:你就不應該用Python寫CPU密集型的代碼…效率擺在那裡…
如果確實需要在CPU密集型的代碼里用concurrent,就去用multiprocessing庫。這個庫是基於multi process實現了類multi thread的API介面,並且用pickle部分地實現了變數共享。
再加一條,如果你不知道你的代碼到底算CPU密集型還是IO密集型,教你個方法:
multiprocessing這個mole有一個mmy的sub mole,它是基於multithread實現了multiprocessing的API。

熱點內容
如何打開u盤文件夾 發布:2024-12-28 02:23:43 瀏覽:781
pascal有哪些編譯器 發布:2024-12-28 02:16:45 瀏覽:98
雲存儲錄像機 發布:2024-12-28 02:16:36 瀏覽:205
hp伺服器如何裝系統 發布:2024-12-28 02:12:14 瀏覽:156
python3utf8 發布:2024-12-28 02:12:07 瀏覽:642
安卓微信現在怎麼掃碼登錄 發布:2024-12-28 02:07:15 瀏覽:942
中國系統安卓蘋果還有什麼 發布:2024-12-28 01:59:28 瀏覽:341
這里的秘密碼是多少 發布:2024-12-28 01:58:07 瀏覽:481
rce訪問 發布:2024-12-28 01:57:58 瀏覽:478
java工程師招生 發布:2024-12-28 01:49:23 瀏覽:604