導航:首頁 > 編程語言 > 線程池共享變數python

線程池共享變數python

發布時間:2022-04-22 07:00:43

1. python進程,線程,協程以及幾種自定義線程池

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

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

2. python多線程能提高效率嗎

很多爬蟲工作者都遇到過抓取速度非常慢,現在的大多數網站都具備了反爬蟲技術,對IP的訪問頻率限制很嚴格。如果想提升爬蟲的速度,大家可以嘗試以下方法。

一、盡量減少訪問次數。
單次爬蟲任務的大多耗時在網路請求等待響應,所以能減少網路請求就盡量減少請求,這樣既能減少目標網站的壓力,也能減少代理伺服器的壓力,提高工作效率。

二、精簡流程,減少重復。
大部分網站並不是嚴格意義上的樹狀結構,而是多重交叉的網狀結構,所以從多個入口深入的網頁會有很多重復,一般根據URL或者ID進行唯一性判別,爬過的就不需要再爬。一些數據如果可以在一個頁面內獲取到,也可以在多個頁面下獲取到,那就選擇只在一個頁面內獲取。

三、多線程任務。
大量爬蟲是一個IO阻塞的任務,所以採用多線程的並發方式可以有效地提高整體速度。多線程可以更好地提高資源利用率,程序設計也更加堅定,程序響應也更快。

四、分布式任務。
上面三點都做到極致了,但是單機單位時間內能爬取到的網頁數量還不足以達到目標,在指定時間內還不能及時的完成任務,那麼就只能多機器來同時進行爬蟲任務了,這就是分布式爬蟲。

做好以上幾點,基本可以將爬蟲的效率提升大半,另外爬蟲代理ip也是不可缺少的尤其是對於量大的任務,IPIDEA提供全球ip的同時更注重保護數據的安全,也可以減少反爬蟲策略的觸發,一舉多得。

3. python中多線程操作全局變數

你要做的只是列印list的內容,而不是修改list的內容,所以這里不需要加鎖,直接列印就行了。

4. 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。

5. Python多線程是什麼意思

簡單地說就是作為可能是僅有的支持多線程的解釋型語言(perl的多線程是殘疾,PHP沒有多線程),Python的多線程是有compromise的,在任意時間只有一個Python解釋器在解釋Python bytecode。
UPDATE:如評論指出,Ruby也是有thread支持的,而且至少Ruby MRI是有GIL的。
如果你的代碼是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。
假設你使用的是multiprocessing的Pool,是使用多進程實現了concurrency
from multiprocessing import Pool
如果把這個代碼改成下面這樣,就變成多線程實現concurrency
from multiprocessing.mmy import Pool
兩種方式都跑一下,哪個速度快用哪個就行了。
UPDATE:
剛剛才發現concurrent.futures這個東西,包含ThreadPoolExecutor和ProcessPoolExecutor,可能比multiprocessing更簡單

6. Python中的線程池是什麼

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

7. 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)

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

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

8. 為什麼有人說 Python 的多線程是雞肋呢

首先,我並不認同這個觀點,我覺得覺得Python 的多線程是雞肋多餘的人,應該還沒有完全使用過Python 的多線程功能,並沒有發掘它的潛在能力。

Python多線程最大的優點就是使用方便,很多時候我們並不需要做大量的密集型數據的處理運算,這時候用Python多線程是最方便快捷的,可以大大減少工作量、提高工作效率。

從以上幾點我們就可以看出,Python多線程並不雞肋,只是有時候使用者在不巧當的地方使用,它自然不是那麼順手,我們加深熟悉了解Python多線程的適用范圍。

9. python多線程和多進程的區別有哪些

python多線程和多進程的區別有七種:

1、多線程可以共享全局變數,多進程不能。

2、多線程中,所有子線程的進程號相同;多進程中,不同的子進程進程號不同。

3、線程共享內存空間;進程的內存是獨立的。

4、同一個進程的線程之間可以直接交流;兩個進程想通信,必須通過一個中間代理來實現。

5、創建新線程很簡單;創建新進程需要對其父進程進行一次克隆。

6、一個線程可以控制和操作同一進程里的其他線程;但是進程只能操作子進程。

7、兩者最大的不同在於:在多進程中,同一個變數,各自有一份拷貝存在於每個進程中,互不影響;而多線程中,所有變數都由所有線程共享。

更多Python知識,請關註:Python自學網!!

閱讀全文

與線程池共享變數python相關的資料

熱點內容
linux打包命令targz 瀏覽:996
抖音app是哪個 瀏覽:407
蘋果app怎麼上架 瀏覽:255
NA伺服器地址 瀏覽:427
我的世界如何初始化伺服器 瀏覽:97
哪個手機app天氣預報最准 瀏覽:752
怎樣把視頻壓縮至25m 瀏覽:570
vivox27文件夾怎麼改變 瀏覽:727
新手玩狼人殺用什麼app 瀏覽:615
pdf在線查看 瀏覽:954
安卓tv90如何關閉後台 瀏覽:683
php讀取word亂碼 瀏覽:755
minicom源碼 瀏覽:1001
海爾冷櫃壓縮機 瀏覽:416
聯通伺服器如何調試信號 瀏覽:136
stata新命令 瀏覽:941
單調棧演算法python 瀏覽:606
微信解壓游戲怎麼下載 瀏覽:962
忍三伺服器不同如何登上賬號 瀏覽:822
php求積 瀏覽:297