Python入門系列(十二)——GUI+多進程

2021-02-21 ParrotSecurity

不好意思,拖堂了,此為終章,補充蠻重要的兩點
一、GUI
二、多進程

一、GUI

話說,python做圖形界面並不明智,效率並不高。但在某些特殊需求下還是需要我們去使用,所以python擁有多個第三方庫用以實現GUI,本章我們使用python基本模塊tkinter進行學習,因為需求並不大,所以不做太多拓展。
繼續改寫上一章的IP查詢系統(= =,要玩爛了),首先略改下IpWhere.py以備調用~

然後使用tkinter模塊進行圖形界面的實現,調用預編譯的IpWhere模塊 :

額,太醜了,但基本實現我們小小的需求,在以後的py學習中,我們再涉及其他的第三方模塊,此處就當是入門了解吧。

正確噠

錯誤噠

二、多進程

十分抱歉把這麼重要的內容放在最後,要不是大佬指點,此次學習可能就要錯過多進程的問題了。
Unix系統提供了forx,python可藉助os模塊調用,從而實現多進程,然而windows系統並不具備,所以我們選擇python內置的multiprocessing多進程模塊進行學習。

友情提示:請先自行補充線程、進程基本概念。

首先我們藉助直接調用多進程來改寫下我們在多線程章節用到的例子!

顯然,這麼寫實在太蠢了,如果我們的任務量巨大,這並不合適。所以我們引入了進程池的概念,使用進程池進行改寫:

在此,我們可以看到所有進程是並發執行的,同樣,我們在多線程章節就講過,主進程的結束意味著程序退出,所以我們需要藉助join()方法堵塞進程。

進程間通信

我們知道線程共享內存空間,而進程的內存是獨立的,同一個進程的線程之間可以直接交流,也就帶來了線程同步的苦惱,這個我們在多線程章節已經講過了;而兩個進程想通信,則必須通過一個中間代理來實現,即我們接下來的內容:進程間通信。

進程之間肯定是需要通信的,作業系統提供了很多機制來實現進程間的通信。Python的multiprocessing模塊包裝了底層的機制,提供了Queue、Pipes等多種方式來交換數據。我們接下來就以Queue的方式進行學習。

Queue.Queue是進程內非阻塞隊列,multiprocess.Queue是跨進程通信隊列,前者是各自私有,後者是各子進程共有。

還有一個在後者基礎上進行封裝的multiprocess.Manager.Queue()方法,如果要使用Pool創建進程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否則會得到一條如下的錯誤信息:RuntimeError: Queue objects should only be shared between processes through inheritance.

接下來我們就藉助進程池來進行多線程操作的改寫,感謝大佬一路輔導。

import time
import os
from multiprocessing import Manager,Pool

def eating(q):
print('吃飯時間到!當前時間:{}'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
print('Process to running: %s' % os.getpid())
time.sleep(2) #休眠兩秒鐘用來吃飯
   print('吃飽啦!當前時間:{}'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
q.get()
def sleeping(q):
print('睡覺時間到!當前時間:{}'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
print('Process to running: %s' % os.getpid())
time.sleep(2) #休眠兩秒鐘用來睡覺
   print('醒啦!當前時間:{}'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
q.get()
def hitting(q):
print('打豆豆時間到!當前時間:{}'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
print('Process to running: %s' % os.getpid())
time.sleep(2) #休眠兩秒鐘用來打豆豆
   print('打出翔了!當前時間:{}'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
q.get()
def working(funcName,q):
if funcName == "eating":
eating(q)
if funcName == "hitting":
hitting(q)
if funcName == "sleeping":
sleeping(q)

def main():
p=Pool(3) #創建進程池
   q=Manager().Queue(2) #創建隊列,為了演示更清晰,我們故意設兩個隊列
   for i in ["eating","sleeping","hitting"]:
q.put(i) #添加隊列
       print("隊列添加成功")
p.apply_async(working, args=(i,q))

#p.close()
   #p.join()
   while True: #用上方注釋的jion()亦可,此處使用循環堵塞隊列
       if q.empty(): #如隊列為空,break,循環結束,主線程結束
           break
if __name__=='__main__':
main()

我們可以看到兩個子線程先執行,然後一個子線程單獨執行,此處有意而為之,讓大家更清晰的了解隊列的使用。期間有一處我們放棄使用jion()方法堵塞,而是自己寫了個循環堵塞,大家根據自己習慣來就好。

實例拓展

話說,真的沒人吐槽麼?上面的例子從需求上來講,完全就不需要多線程好不好!emmmm,我們來點實力拓展,寫一個有智商的多線程腳本,順便結合上一節的web來一個綜合篇,隨便找個現實需求吧!

emmm,比如我們來到當當網買書,搜一下我們想要的書籍,發現!!太多了!!真J2亂!!看不過來!!不想翻頁!!直接告訴我哪個便宜、哪個牛逼好不好!!

當當網

簡單看下這個url:
http://search.dangdang.com/?key=滲透測試&ddsale=1&page_index=2
其中ddsale參數代表噹噹自營,page_index代表頁數,key代表搜索內容,我們本次的變量只有頁數。

所以我們構造請求的url為:
'http://search.dangdang.com/?key=滲透測試&ddsale=1&page_index='+str(page)
如果修改的內容不使用str字符串轉化,會收到如下報錯:
TypeError: can only concatenate str (not "int") to str
然後我們看一下頁面內容的分布情況,本次我們關心賣什麼書,賣多少錢?

網站源碼

對應的編寫我們的正則匹配規則,當然了,有更簡便的第三方庫可以幫我們處理,但為了更好的形成流程性認識,我們這裡依然使用正則。
我們對應我們需要的書籍名稱和當前價格匹配如下:
<a title=" (.*?)" ddclick=
<span>&yen;(.*?)</span>
那麼,思路理清了,我們就開始使用多線程來寫我們的小系統~

import requests
import re
from multiprocessing import Pool, Manager

headers = {'user-agent': 'ceshi/0.0.1'}

#信息爬取模塊
def getInfo(page,yourkey):
r = requests.get('http://search.dangdang.com/?key='+str(yourkey)+'&ddsale=1&page_index='+str(page) , headers=headers)
r1=re.compile(r'<a title=" (.*?)"  ddclick=')
r2=re.compile(r'<span>&yen;(.*?)</span>')
re1 = r1.findall(r.text)
re2 = r2.findall(r.text)
return dict(zip(re1, re2)) #將列錶轉為字典
#文件存儲模塊
def saveinfo(page,yourkey,q):
fw = open('DangDang.txt', 'a')
di=getInfo(page,yourkey) #新建字典接收返回結果
   for i in di: #整理格式寫入文件
       fw.write('書籍名稱:'+i+'\t'+'當前價格'+di[i]+'\n')
fw.close()
q.put(page)

#進程池管理模塊
def poolmana(pages,yourkey):
p = Pool(10)
q = Manager().Queue()
for i in range(pages):
p.apply_async(saveinfo, args=(i+1, yourkey,q))
p.close()
p.join()
print('讀取完成>>>>>\n請查看當前路徑下文件:DangDang.txt')

#助手函數,輸入判斷
def is_number(s): #當了個助手函數用來判斷用戶輸入內容
   try:
float(s)
return True
   except ValueError:
pass
   try:
import unicodedata
unicodedata.numeric(s)
return True
   except (TypeError, ValueError):
pass
   return False
#主函數,實現界面
def main():
print('''
           ============================================
               【歡迎來到史上最屌的當當網查詢系統】  
                                 (輸入exit退出)      
           ============================================
                                   ''')
while True:
try:
yourkey=input('請輸入您要查詢的內容:')
if yourkey=='exit':
break
           pa=input('請輸入希望檢索的頁數:\n(默認為3)\n')
if pa=='exit':
break
           if is_number(pa)==False: #使用助手函數判斷輸入是否為數字,如否,使用默認值3
               pa=3
           print('讀取ing~>>>>>>\n數據量較大,請耐心等待>>>>>')
poolmana(int(pa),str(yourkey))
except:
print("請規範您的輸入!")

if "__main__" == __name__ :
main()

然後我們去查看一下我們的結果文件~

DangDang.txt

現在這個小系統具備的功能就是根據用戶需要選擇要檢索的書籍,然後整理下名稱和價格,開了10個線程,如果小夥伴pc給力的話可以繼續加。簡單的異常處理機制和界面交互,基本滿足日常所需。

emmmmm,py入門系列到此結束!當初立的flag並沒有垮掉!

flag

小結一下,本次py學習應該是從1.11號開始的,完全0基礎開始,砍去出差、周末時間,工作之餘零零散散的學習時間應該在十天左右,所以十天的時間用點心的話,自學python應該是沒有問題的。

關於學習材料的話,廖雪峰老師的教程配上菜鳥教程的基本理論,再來幾個可以幫你解答疑惑的py大佬,足夠了。雖然較專業開發與框架運用還有很大差距,但,py的徵途已經開始了~

相關焦點

  • python辦公自動化:PyAutoGUI入門秘笈一
    要讓工作輕鬆,生活快樂,工資拿的多,老闆還高興的夢想實現,除了做夢,學好PyAutoGUI,讓機器幫你幹活就能實現這麼舒爽的目標。學好PyAutoGUI,讓機器幫你幹活就能實現這麼舒爽的目標有同學看了以前對python辦公自動化:讓PyAutoGUI來幫你幹活,很感興趣,開始動手實踐。但是遇到很多問題,怎麼能讓大家能更快的入門PyAutoGUI呢,特地準備了以下系列,從入門到使用技巧,對PyAutoGUI做了全方位的解讀。
  • Python快速入門的方法
    那麼,作為一個新手,如何才能快速並有效的入門呢?0.快速入門《和孩子一起學編程》這本書說是給兒童設計的,所以內容比較生動。非常非常非常簡單易懂 不用花太長時間就能看下來一遍。import一個easygui,初學者分分鐘做個圖形界面出來,對於初學python,成就感!!
  • PyAutoGUI:自動化鍵鼠操作的Python類庫
    pip install pyautogui用pip安裝這裡順便介紹一下PyAutoGUI的坐標系統,和一些常見的繪圖坐標系統相同,左上角為原點,向右是x軸正方向,向下是y軸正方向。假如你的屏幕是1920*1080,那麼右下角的坐標就是(1919, 1079),因為坐標是從0開始的,而不是從1開始的,這一點要格外注意。
  • 入門Python, 看這些資料就夠了
    學習和關注python有五年多的時間。 收藏了一些不錯的網站和資源,和大家分享。
  • 十六本python入門學習書籍推薦,python入門新手必看
    隨著人工智慧時代的到來,python程式語言一步登天衝到編程排行榜第一名,因此更多朋友想轉行學習python程式語言的朋友,可以一起看一下:python入門新手必看的十六本python入門學習書籍1、python基礎教程司維所著圖書:本書包括Python程序設計的方方面面,首先從Python
  • Python和Qt開發簡單的GUI應用(電子書及視頻教程)
    課程優惠連結:https://www.udemy.com/create-simple-gui-applications-with-python-and-qt/?couponCode=BLOG9電子書在線免費閱讀:https://leanpub.com/create-simple-gui-applications/read#leanpub-auto-qt-and-pyqt 配套視頻教程也可以通過編程派的微信號獲取,只需回復關鍵詞「pyvideo02」即可獲得百度網盤分享連結及提取碼。
  • Python | Python學習之多進程詳解
    進程詳解並行與並發怎麼理解?為了充分利用多核CPU資源,Python中大部分情況下都需要使用多進程。在python中我們如何創建多進程?進程和線程的區別我們經常迷惑於多進程和多線程,長的好像一樣,但是他們有本質上的區別,很多大佬也對進程和線程的概念做了很多通俗易懂的解釋,這裡我們引用阮一峰老師的博文,大家可以先去看看,理清楚線程和進程的區別。
  • python入門
    --Yves Hilpisch 《Python for Finance》發現近期學習python的人越來越多了,最近也有人問我有沒有啥課程或者書推薦的。我自己還是側重數據計算和在金融中的應用,系統管理、web開發等沒做過。我當年也是新手入門,自己搜索嘗試,買了很多的書,也在網上下載了很多資料。
  • Python入門必備的書籍推薦
    python推薦一:《Python學習手冊:第3版》《Python學習手冊函數——Python根本的面向進程東西,用於安排代碼和重用。模塊——封裝語句、函數以及其他東西,然後能夠安排成較大的組件。類和OOP——Python可選的面向政策編程東西,可用於安排程序代碼然後完成定製和重用。
  • 用Python數據處理分析入門必備系列文章:基本類型與運算
    此系列文章收錄在公眾號 : 數據大宇宙 > Python入門必備 > 必備知識建議你按其順序觀看文章最近有許多小夥伴問我要入門 Python 的資料,還有小夥伴完全沒有入門 Python 就直接購買了我的 pandas 專欄。因此我決定寫幾篇 Python 數據處理分析必備的入門知識系列文章,以幫助有需要的小夥伴們更好入門。
  • Linux 平臺下 Python 腳本編程入門(一)
    在這個由兩篇文章構成的系列中,我們將回顧 Python 的基礎部分,希望初學編程的你能夠將這篇實用的文章作為一個編程入門的跳板,和日後使用 Python 時的一篇快速指引。Linux 中的 PythonPython 2.x 和 3.x 通常已經內置在現代 Linux 發行版中,你可以立刻使用它。
  • python gui 中三大框架tkinter,wxpython, pyqt如何選擇
    python開發圖形界面也有這樣的煩惱,有很多gui框架提供我們選擇,讓我們眼花繚亂,我們很難從中選擇一個。下面我簡單介紹下主流的三個python gui框架。當然,Tkinter也有自己的優點,因為Tkinter是python自帶的圖形庫,所以它的性能不是很差,此外,它也更容易學習。      比較了Tkinter和QT,接下來我們談一談wxPython。  wxPython可以說是上面兩者之間的一個很好的妥協。
  • 如何入門Python之Python基礎教程詳解
    隨著人工智慧的發展,Python近兩年也是大火,越來越多的人加入到Python學習大軍,對於毫無基礎的人該如何入門Python呢?這裡整理了一些個人經驗和Python入門教程供大家參考。如果你是零基礎入門 Python 的話,建議初學者至少達到兩個目標: 會用,理解。
  • Python 從零開始--入門篇
    從這篇文章開始我將分享 python 系列,從 ptyhon 的起始發展,到現在的方方面面, 從最基礎的語法開始,大家一起學習
  • Python編程入門練習題題目匯總-開課吧Python習題
    Python題目一:談下python的GILpython的GIL是python六:提高python運行效率的方法1、使用生成器,節約內存2、優化for循環3、核心模塊用Cpython PyPy等,提高效率4、多進程,多線程、協程5、判斷可能性大的放到前面
  • Python推薦書籍從入門到進階(珍藏版)
    《Head First Python》Head First 系列的書籍一直飽受讚譽,這本也不例外。Head First Python主要講述了Python 3的基礎語法知識以及如何使用Python快速地進行Web、手機上的開發
  • python入門——注釋的妙用
    堅持每天更新,幫助入門python小夥伴們,夜深了,給大家講一講python注釋的吧。大家如果學習過c語言,就會知道程序的注釋有什麼用。這裡多提一句吧,C語言的注釋分兩種,單行注釋和多行注釋。C語言的單行注釋是最常用的是//,多行注釋最常用的是/* */好了,言歸正傳我們繼續來學習python吧,python常用單行注釋是#,常用多行注釋是三對單引號''' '''全理論太抽象,我們一起來看一看例子吧~~~一、單行注釋單行注釋第一個printprint 'woaipython','hello,world'
  • python入門書籍,輕鬆學python
    全民學python的熱潮已經開啟,然而,對於這種情況,還是有很多小夥伴私信我python到底該怎麼入門?沒接觸過編程能學會嗎?
  • Python語言如何入門
    閱讀本文大概需要5分鐘:Python 語言應該如何入門,記得我幾年前也碰到過這樣的問題,當時網上隨便搜了一下飢不擇食的找了一些書開始啃起來,結果發現很疑惑,感覺吃力,走了很多彎路。下面我具體來講講:1.找一本靠譜的書,難度一定要是入門級別,千萬不能太複雜,不要一下子陷進去,會打亂節奏,學東西要循序漸進,不能一口吃個胖子.打個比方,學過java的同學都聽過大名鼎鼎的thinking in java,這邊書很厚很全,若一上來就學,肯定會吃力,時間長了就會失去興趣,因此對初學者來說,一定要找一個通熟易懂的,簡單的書。入門的書非常關鍵。
  • 作為數據科學家你應該知道這些 python 多線程、進程知識
    並行處理可以用 python 以兩種不同的方式實現:多處理和線程。多處理與線程:理論基本上,多處理和線程是實現並行計算的兩種方法,分別使用進程和線程作為處理代理。為了理解它們的工作原理,我們必須搞清楚什麼是進程和線程。進程進程是正在執行的電腦程式的實例。