標籤:資料庫 requests assm 就是 任務 put http table 修改
1.面對對象編程
1.1 基本概念
執行個體方法:在類裡面定義的函數都是執行個體方法,函數內有self變數
類方法:
- 不可以執行個體化,直接用類名調用
- 類方法可以使用類變數,cls.xxx
- 執行個體可以通過self.xx使用類方法
類方法裡面不能使用執行個體方法和執行個體變數
靜態方法:
- 定義在類裡的普通函數
- 用不了執行個體方法,執行個體變數,類方法,類變數
不需要執行個體化,直接用類名調用
? 屬性方法:
- 是執行個體方法
- 不能有入參
- 用它的時候,直接m.func,把它當做變數來使用,後面不需要加括弧
它是擷取函數的傳回值
解構函式:在執行個體被回收的時候執行,執行個體在程式結束時被回收
建構函式:【init】類在執行個體化的時候,會自動執行
私人函數:【del】兩個底線開頭,聲明該方法為私人方法,只能在類的內部調用 ,不能在類地外部調用
class My: def __init__(self):#建構函式,類在執行個體化的時候,會自動執行 print(‘執行建構函式‘) def __del__(self): #解構函式,在執行個體被銷毀的時候會自動執行 print(‘執行解構函式‘) def say(self): #入參裡面有self的是執行個體方法,只有通過執行個體化才可以調用 print(‘我是牛奶‘) self.__cry() def __cry(self): #私人函數,只能在類裡面調用 print(‘哇哇哇‘) @classmethod #類方法,可以執行個體化調用,通過類名直接調用 def eat(cls): print("吃飯") @staticmethod #靜態方法,不需要執行個體化,直接用類名調用 def run(): pass @property #屬性方法,是執行個體方法,使用的時候直接當做變數來用 def red_pag(self): return 100
1.2裝飾器:他們是修改其他函數的功能的函數
裝飾器小例子
import time,requestsdef timer(func): def war(*args,**kwargs): start = time.time() res = func(*args,**kwargs) end_time = time.time() print(‘啟動並執行時間是%s‘%(end_time-start)) return res return war@timerdef down_img(name): res=requests.get(‘http://www.nnzhp.cn/wp-content/uploads/2018/07/60f2add20f0659e27d26435f28b8472e.png‘) open(‘a.png‘,‘wb‘).write(res.content) return name+‘hhh‘@timerdef eat(): time.sleep(5)res = down_img(‘xxx‘)print(res)eat()
1.3 繼承
class Ln: #父類 money=2000 def make_money(self): print(‘掙錢‘)class Me(Ln) #子類繼承父類 def make_money(self): print(‘掙更多的錢’)
2.搭建測試環境
第一次搭建
- 安裝依賴軟體mysql,redis,tomcat,nginx,jdk,資料庫,中介軟體等
- 從SVN,git上擷取代碼
- 編譯(java,c,c#)
- 匯入基礎資料
- 修改設定檔
- 啟動項目
日常部署
- 擷取最新代碼
- 編譯
- 執行sql檔案(如果資料庫結構有改變的話)
- 修改設定檔
- 重啟項目
3.多線程與多進程
進程:一個進程就是一個程式。
線程:線程就是進程裡面最小的執行單元。 一個進程裡面最少有一個線程,可以有多個線程, 每個線程之間都是互相獨立的。
由於python裡面的GIL(全域解譯器鎖)機制,它確保任何時候都只有一個Python線程執行 ,所以python裡面的多線程,利用不了多核cpu,只能利用一個核心的cpu。在CPU密集型進程,那多線程並不能帶來效率上的提升,相反還可能會因為線程的頻繁切換,導致效率下降; 如果是IO密集型進程,多線程進程可以利用IO阻塞等待時的空閑時間執行其他線程,提升效率。
多線程適用於IO密集型任務,多進程適用於CPU密集型任務
import threading,timeall_res=[]def run(): time.sleep(5) print(‘%s 哈哈哈‘%name) all_res.append(name)threads=[] #存放所有的子線程for i in range(10) #開10個子線程 t = threading.Thread(target=run,args=(i,)) threads.append(t) t.start() #方法一:統計當前線程數量判斷所有子線程是否運行完成while threading.active_count()!=1: pass #當while=1,說明子線程已經完成,結束迴圈,程式向下執行#方法二:主線程迴圈等待所有的子線程結束後再結束for t in threads: t.join()#等待子進程運行完以後再運行print(all_res)
守護線程:當主線程結束後,守護進程也會結束
import threading,timedef run(): time.sleep(8) print(‘run。。‘)for i in range(10): t=threading.Thread(target=run) t.setDaemon(True) #設定子線程為一個守護進程 t.start() print(‘over‘)#主線程結束後,子線程就結束了,run函數不會執行
鎖
import threadingfrom threading import Locknum = 0Lock = Lock()def run(): global num lock.acquire() #加鎖 num+=1 lock.release() #解鎖 with lock: #自動加解鎖 num+=1for i in range(100): t=threading.Thread(target=run) t.start()while threading.active_count()!=1: passprint(num)
線程池
可以控制最多允許多少個線程同時進行,超出的部分自動等待。解決了線程運行分配任務不均,比如一個線程還在苦苦工作,而另一個線程已經完成,卻無法協助前一個線程分擔的情況 。
import threadpool,pymongo,requestsclient = pymongo.MongoClient(host=‘118.24.3.40‘,port=27017)table=client[‘liken‘][‘qq_group_likun‘]all_table=[i.get(‘qq‘) for i in table.find()]url = ‘http://q4.qlogo.cn/g?b=qq&nk=%s&s=140‘def down_img(qq_num): res=requests.get(url%qq_num).content with open(‘%s.jpg‘%qq_num,‘wb‘) as fw: fw.write(res)pool = threadpool.ThreadPool(200) #定義線程池的大小all_requests=threadpool.makeRequests(down_img,all_qq) #分配資料for i in all_requests: pool,putRequest(r) #發請求#[pool.putReques(r) for r in all_requests]pool.wait() #等待所有線程運行完成print(‘done!下載完成。‘)
python介面自動化九--面對對象編程二,搭建測試環境,多線程與多進程