執行緒池可以理解為乙個裝載多執行緒的池子,池中放置了指定數量的執行緒,當我們提交的任務超過執行緒池的數量時,多餘的任務會進行排隊等待,待其他任務執行完畢後,再將佇列中的任務提交到執行緒執行,執行緒池的好處是,能同時執行多個任務,復用執行緒資源,減少執行緒的建立和銷毀,更節約系統資源。
1.普通**,理論是在乙個執行緒執行任務,和其他語言類似,**從上至下依次執行。
import time
deftest_data
(index)
: time.sleep(5)
if index %2==
0:print
(f'執行錯誤。'
)raise exception(
'我報錯了'
)print
(f'執行完畢。'
)for i in
range(1
,50):
test_data(i)
1執行完畢。
traceback (most recent call last):
file "/users/peakchao/code/py/reptileforpython/pool_test.py", line 15, in test_data(i)
file "/users/peakchao/code/py/reptileforpython/pool_test.py", line 11, in test_data
raise exception('我報錯了')
exception: 我報錯了
2執行錯誤。
分析:迴圈呼叫test_data方法,test_data方法中睡眠5秒後對傳入的值進行取餘,如果餘數為0,則丟擲異常,當i=1時,程式正常執行,在第二次迴圈時,i==2,取餘等於0,丟擲異常,程式崩潰退出。
注意:此時每過5秒才能列印依次。2.多執行緒**,理論是多個執行緒同時執行任務,執行緒池在不同語言中都有相似的實現。
import time
from concurrent.futures import threadpoolexecutor
pool = threadpoolexecutor(max_workers=2)
deftest_data
(index)
: time.sleep(5)
if index %2==
0:print
(f'執行錯誤。'
)raise exception(
'我報錯了'
)print
(f'執行完畢。'
)for i in
range(0
,50):
pool.submit(test_data, i)
1執行完畢。0執行錯誤。
3執行完畢。
2執行錯誤。
4執行錯誤。
5執行完畢。
6執行錯誤。
7執行完畢。
分析:同一時刻有2個列印,說明有2個任務在並行,如果我們把執行緒池數量改為n,那麼他的執行效率是單執行緒的n倍。有時我們抓取**資料時,伺服器會返回錯誤,而我們使用瀏覽器訪問卻又能正常開啟,是因為伺服器分析了我們的請求資料,判斷出我們是爬蟲,所以終止了正常響應,當我們頻繁抓取某個**資料時,即使設定了請求偽裝也會偶有失敗,是因為請求資訊固定,且有規律所以被攔截。
user_agents =[,
,,,]
defget_request_headers()
: headers =
return headers
往往系統定義的異常不能滿足需求,為了丟擲更明確的錯誤,以及後續對自己想要的錯誤進行攔截處理,我們需要自定義異常。class
baseexception
(exception)
:def
__init__
(self, msg)
: self.msg = msg
def__str__
(self)
:print
(self.msg)
try:
input_data =
input
('請輸入:')if
len(input_data)
>0:
raise baseexception(
'哈哈,不允許輸入任何文字哦~'
)print
('執行完畢'
)except baseexception as err:
print
(f'捕捉到自定義異常:'
)
請輸入:666
哈哈,不允許輸入任何文字哦~
哈哈,不允許輸入任何文字哦~
traceback (most recent call last):
file "/users/peakchao/code/py/reptileforpython/pool_test.py", line 30, in raise baseexception('哈哈,不允許輸入任何文字哦~')
__main__.baseexception: during handling of the above exception, another exception occurred:
traceback (most recent call last):
file "/users/peakchao/code/py/reptileforpython/pool_test.py", line 33, in print(f'捕捉到自定義異常:')
typeerror: __str__ returned non-string (type nonetype)
process finished with exit code 1
自定義執行緒池
有些時候 jdk自帶的cachedthreadpool fixedthreadpool等執行緒池完成不了我們業務的需求時 可以用threadpoolexecutorg構造自定義的執行緒池。public class usethreadpoolexecutor1 這段 會首先執行任務1,然後把2 3 4...
自定義執行緒池
建立執行緒池方法 儘管executors提供了四種執行緒池建立的方式,但為了實現某些特定的需求,可以自己建立執行緒池。如在阿里的程式設計規範使用executors建立執行緒時,一般會報錯,並提示以下資訊 執行緒池不允許使用executors去建立,而是通過threadpoolexecutor的方式,...
自定義執行緒池
自定義執行緒池建立api 執行緒池建立通過juc的介面 executor 實現,平時我們使用其實現類 threadpoolexecutor 實現自定義執行緒池。常用建構函式 public threadpoolexecutor int corepoolsize,int maximumpoolsize,...