接口測試-並發處理
阿新 • • 發佈:2018-07-29
def 並發 默認 程序 上一個 == 下一個 spa __name__
1 多線程執行
import threading
from datetime import *
def test():
print(datetime.now())
def thd():
Theaders = []
for i in range(10):
t = threading.Thread(target=test)
Theaders.append(t)
for t in Theaders:
t.start()
if __name__ == ‘__main__‘:
thd()
如果要並發執行N次,建議將並發數拆分成n次,每個線程循環執行n次函數,這樣在啟動下一個線程的時候,上一個線程已經在循環執行了。
import threading
from datetime import *
def test():
print(datetime.now())
def looptest():
for i in range(50):
test()
def thd():
Threads= []
for i in range(100):
t = threading.Thread(target=looptest)
Threads.append(t)
for t in Threads:
t.start()
if __name__ == ‘__main__‘:
thd()
2 守護線程
上面創建的線程是main()線程的子線程,即先啟動主線程main(),然後執行thd自動子線程。
守護線程則是在主線程執行完後,所有的子線程都被關閉(無論子線程是否執行完成)。默認是沒有守護線程,主線程執行完畢之後,會等待子線程全部執行完畢,才會結束程序。如果當子線程死循環,程序將不會關閉,因此在測試時可以設置守護線程解決這個問題。
import threading
from datetime import *
def test():
print(datetime.now())
def looptest():
for i in range(50):
test()
def thd():
Threads= []
for i in range(1):
t = threading.Thread(target=looptest)
Threads.append(t)
t.setDaemon(True)
for t in Threads:
t.start()
if __name__ == ‘__main__‘:
thd()
3 阻塞線程
還可以通過子線程join()方法阻塞線程,讓主線程等待子線程完成之後再往下執行,等主線程執行完畢後在關閉所有子線程。
並且可以通過join()的timeout參數來控制,如果超過時間子線程未完成,則主線程繼續執行,執行完成後關閉子線程。
import threading
from datetime import *
def test():
print(datetime.now())
def looptest():
for i in range(50):
test()
def thd():
Threads= []
for i in range(1):
t = threading.Thread(target=looptest)
Threads.append(t)
t.setDaemon(True)
for t in Threads:
t.start()
for t in Threads:
t.join(1)
if __name__ == ‘__main__‘:
thd()
超時機制:完成第一個線程的超時之後開始計算第二個線程的超時,如果執行10個線程超時時間就是10秒。一般不推薦用timeout參數,而是在函數內加上超時判斷。
阻塞線程的主要意義在於控制子線程與主線程的執行順序。
接口測試-並發處理