python多進程目錄掃描

代碼部分:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

import requests
from multiprocessing import Pool

def requrl(url,direlist,headers):
    for t in direlist:
        try:
            murl = url + str(t, encoding='utf-8').replace('\r', '').replace('\n', '')
            request = requests.get(murl,headers=headers,timeout=1)
            if request.status_code in [200,301,302,403]:
                print(murl)
        except UnicodeDecodeError and Exception:
            pass

if __name__ == "__main__":
    url = "www.xmxing.net"
    if not url.startswith('http://') or not url.startswith('https://'):
        url = "http://" + url
    f = open(r'D:\tools\字典文件\路徑\綜合目錄\新建文件夾 (2)\php.txt','rb')
    dire = f.readlines()
    f.close()
    headers = {
        'user-agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36"
    }
    length = int(len(dire)/10)
    process = Pool(20)
    for t in range(1,length+1):
        start = (t-1)*10
        end = t*10 if t*10 <= len(dire) else len(dire)
        process.apply_async(requrl,args=(url,dire[start:end],headers))
    process.close()
    process.join()
    print("執行完成")

心得體會:

1、之所以使用多進程,是因爲python有個叫GIL(Global Interpreter Lock)鎖的東西,任何Python線程執行前,必須先獲得GIL鎖,然後,每執行100條字節碼,解釋器就自動釋放GIL鎖,讓別的線程有機會執行。這個GIL全局鎖實際上把所有線程的執行代碼都給上了鎖,所以,多線程在Python中只能交替執行,即使100個線程跑在100核CPU上,也只能用到1個核。

      在我們要跑這種工作量比較大的程序時,多線程未必能比正常的順序執行來的快,可能還會更慢。多進程就沒有這樣的問題,能夠充分利用我們的多核CPU

2、多進程模塊中的進程池的使用問題:p = Pool(5),意思是創建一個能夠支持5個進程併發執行的進程池,當我們所需要執行某個函數次數大於進程池總數時,多餘的會在進程池的等待隊列等待,這個等待並不會影響主線程的執行,直到池中有進程結束,纔會創建新的進程來執行下一個請求

3、使用Pool()之後一定要關閉它p.close()不再接收任何請求,不然會報錯

4、多進程的代碼一定要寫在main函數裏面,否則也會報錯

發佈了9 篇原創文章 · 獲贊 10 · 訪問量 1767
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章