python執行緒池 自定義異常 請求偽裝

2021-10-03 18:55:28 字數 2989 閱讀 9790

執行緒池可以理解為乙個裝載多執行緒的池子,池中放置了指定數量的執行緒,當我們提交的任務超過執行緒池的數量時,多餘的任務會進行排隊等待,待其他任務執行完畢後,再將佇列中的任務提交到執行緒執行,執行緒池的好處是,能同時執行多個任務,復用執行緒資源,減少執行緒的建立和銷毀,更節約系統資源。

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