繼續改寫上壹章的IP查詢系統(= =,就爛了)。先稍微改壹下調用的IP where . py ~
然後用tkinter模塊實現圖形界面,調用預編譯的IpWhere模塊:
嗯,很醜,但是基本滿足了我們的小需求。在以後的py學習中,我們會涉及到其他的第三方模塊,這裏只是介紹壹下。
非常抱歉把這麽重要的內容放在最後。如果不是大老板的指導,我們可能會錯過這個研究中的多流程問題。
Unix系統提供了forx,python可以被os模塊調用,從而實現多進程,而windows系統沒有,所以我們選擇python內置的多處理多進程模塊進行學習。
首先,讓我們通過直接調用多個進程來重寫我們在多線程壹章中使用的例子!
很明顯,這樣寫真的很蠢。如果我們的任務很大,那就不合適。所以我們引入了進程池的概念,並用它來重寫:
在這裏,我們可以看到所有的進程都是並發執行的。同樣,正如我們在多線程壹章中所說的,主進程的結束意味著程序的退出,所以我們需要使用join()方法來阻塞進程。
我們知道線程* * *享有內存空間,而壹個進程的內存是獨立的,同壹進程的線程可以直接通信,這就帶來了線程同步的苦惱,這個我們在多線程章節已經講過了;但是,如果兩個進程想要通信,就必須通過壹個中間代理來實現,這就是我們接下來的內容:進程間通信。
進程之間必須有通信,操作系統提供了很多機制來實現進程之間的通信。Python的多處理模塊包裝了底層機制,並提供了許多交換數據的方式,比如隊列和管道。接下來,我們將以隊列的形式學習。
排隊。隊列是壹個進程內非阻塞隊列,是多進程的。隊列是壹個跨進程通信隊列。前者是私有的,後者由每個子進程擁有。
還有壹個多重過程。Manager.Queue()方法封裝在後者的基礎上。如果您想使用Pool創建壹個進程,您需要在多重處理中使用Queue()。Manager()而不是多重處理。隊列()。否則,您將得到以下錯誤消息:運行時錯誤:隊列對象只能通過繼承在進程之間共享。
接下來我們用進程池重寫多進程操作,謝謝大家的指導。
我們可以看到兩個子線程先執行,然後壹個子線程分開執行,這裏是故意的,讓大家更清楚的理解隊列的用途。期間我們放棄了使用jion()方法進行分塊,而是自己寫了壹個循環分塊,就按照自己的習慣來做吧。
換句話說,真的沒人吐槽嗎?從需求上來說,上面的例子根本不需要多線程!Emmmm,我們擴充壹下實力,用智商寫個多線程腳本,結合上壹節的web,做壹篇綜合的文章,這樣找個現實的需求就行了!
Emmm比如我們來當當買書,搜索想要的書,找到!!太多了!!真是壹團糟!!我看不到!!不想翻頁!!妳就告訴我哪個便宜哪個牛逼吧!!
簡單看壹下這個網址:
/?Key=滲透測試&;DD sale = 1 & amp;page_index=2
其中,ddsale參數代表當當網的自營,page_index代表頁面數量,key代表搜索內容。我們這次的變量只是頁數。
因此,我們將請求的url構造如下:
'/?Key=滲透測試&;DD sale = 1 & amp;page_index='+str(page)
如果修改的內容不是由str字符串轉換的,您將收到以下錯誤:
TypeError:只能將str(不是" int ")連接到str
然後我們來看看頁面內容的分布情況。這次我們關心什麽書,賣了多少?
對應寫我們的正則匹配規則,當然也有更簡單的第三方庫可以幫我們處理,但是為了更好的形成壹個過程理解,這裏還是用正則化。
我們將所需書籍的名稱與當前價格進行匹配,如下所示:
& lta title= "(。*?)" ddclick=
& ltspan class="search_now_price " >?(.*?)& lt/span>。
然後等思路清晰了,就開始用多線程來寫我們的小系統~
那我們查壹下我們的結果文件吧~
現在這個小系統的功能就是根據用戶的需求選擇要檢索的書籍,然後整理出名稱和價格,開通10線程。如果小夥伴pc功能強大,可以繼續添加。簡單的異常處理機制和界面交互基本滿足日常需求。