python接口自動化九--面對對象編程二,搭建測試環境,多線程與多進程
阿新 • • 發佈:2018-08-01
res cat ret 利用 導致 運行 外部 用不了 **kwargs
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,requests def 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 @timer def 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‘ @timer def 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,time
all_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,time
def 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 threading
from threading import Lock
num = 0
Lock = Lock()
def run():
global num
lock.acquire() #加鎖
num+=1
lock.release() #解鎖
with lock: #自動加解鎖
num+=1
for i in range(100):
t=threading.Thread(target=run)
t.start()
while threading.active_count()!=1:
pass
print(num)
線程池
可以控制最多允許多少個線程同時進行,超出的部分自動等待。解決了線程運行分配任務不均,比如一個線程還在苦苦工作,而另一個線程已經完成,卻無法幫助前一個線程分擔的情況 。
import threadpool,pymongo,requests
client = 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接口自動化九--面對對象編程二,搭建測試環境,多線程與多進程