涉及到線程恃慧,就會存在阻塞和非阻塞肺魁、同步和異步呵扛。
阻塞和非阻塞
強調(diào)的是程序在等待調(diào)用結果(消息每庆,返回值)時的狀態(tài). 阻塞調(diào)用是指調(diào)用結果返回之前,當前線程會被掛起今穿。調(diào)用線程只有在得到結果之后才會返回缤灵。非阻塞調(diào)用指在不能立刻得到結果之前,該調(diào)用不會阻塞當前線程蓝晒。 對于同步調(diào)用來說腮出,很多時候當前線程還是激活的狀態(tài),只是從邏輯上當前函數(shù)沒有返回而已拔创,即同步等待時什么都不干利诺,白白占用著資源。
同步和異步
強調(diào)的是消息通信機制 (synchronous communication/ asynchronous communication)剩燥。所謂同步慢逾,就是在發(fā)出一個"調(diào)用"時,在沒有得到結果之前灭红,該“調(diào)用”就不返回侣滩。但是一旦調(diào)用返回,就得到返回值了变擒。換句話說君珠,就是由“調(diào)用者”主動等待這個“調(diào)用”的結果。而異步則是相反娇斑,"調(diào)用"在發(fā)出之后策添,這個調(diào)用就直接返回了材部,所以沒有返回結果。換句話說唯竹,當一個異步過程調(diào)用發(fā)出后乐导,調(diào)用者不會立刻得到結果。而是在"調(diào)用"發(fā)出后浸颓,"被調(diào)用者"通過狀態(tài)物臂、通知來通知調(diào)用者,或通過回調(diào)函數(shù)處理這個調(diào)用
參考博客:https://blog.csdn.net/huangqiang1363/article/details/79508852
實際應用場景:
python-locust單機分布式壓測产上。
當locust以分布式運行啟動master主機后棵磷,線程是阻塞的,會等待n個worker鏈接晋涣。要實現(xiàn)的最終效果為用subprocess.Popen先啟動master主機仪媒,接著啟動n個worker。這樣就不需要每次都打開三四五六七八個終端窗口來啟動n個worker姻僧,具體實現(xiàn)代碼如下:
#入?yún)orker默認為1规丽,運行一個master,一個worker
def demo(worker=1):
master_worker = ['master']
for num in range(worker):
master_worker.append("worker")
start_worker_number = worker
worker_num = -1
for i in master_worker:
worker_num += 1
if i == 'master' :
#創(chuàng)建master線程
t = threading.Thread(target=LocustThreading(locust=i, num=start_worker_number).create_tread)
t.start() #啟動 master撇贺,不能用join()方法赌莺,否則會阻塞,不會啟動worker
time.sleep(3)
else:
#創(chuàng)建worker線程
t = threading.Thread(target=LocustThreading(locust=i, num=worker_num).create_tread)
t.start() #啟動 worker
time.sleep(2)