demo1: 多執行緒為普通執行緒時==》ctrl+c無法退出程式
def foo():
print(123)
time.sleep(1)
print("end123")
def bar(para):
print("start thread:{}".format(para))
time.sleep(20)
print("end thread:{}".format(para))
if __name__ == '__main__':
ths =
for i in range(10):
t=thread(target=bar,args=(i,))
# t.daemon = true
for item in ths:
item.start()
print('main end')
》
demo2: 設定為守護執行緒加join阻塞主程式 ==》 ctrl+c無法退出程式
def foo():
print(123)
time.sleep(1)
print("end123")
def bar(para):
print("start thread:{}".format(para))
time.sleep(20)
print("end thread:{}".format(para))
if __name__ == '__main__':
ths =
for i in range(10):
t=thread(target=bar,args=(i,))
t.daemon = true
for item in ths:
item.start()
for item in ths:
print('join-')
item.join()
print('main end')
demo3:引入訊號處理,檢視訊號接收情況
def foo():
print(123)
time.sleep(1)
print("end123")
def bar(para):
print("start thread:{}".format(para))
time.sleep(20)
print("end thread:{}".format(para))
def handler(signum, frame):
global is_exit
is_exit = true
print("receive a signal , is_exit = ".format(signum, is_exit))
if __name__ == '__main__':
signal.signal(signal.sigint, handler)
signal.signal(signal.sigterm, handler)
ths =
for i in range(10):
t=thread(target=bar,args=(i,))
# t.daemon = true
for item in ths:
item.start()
print('main end')
訊號接收情況:
1.非daemon執行緒執行時,主線程**執行完後,要等執行緒執行完才處理接收的訊號 --訊號不能被立即處理
2.join阻塞時訊號會被接收,不會被處理,join完成後會處理訊號 -- 訊號不能被立即處理
綜上:主線程**未執行完畢且非阻塞的情況下才能立即處理訊號
改進:1.使用thread.isalive()判斷各個子執行緒是否執行完畢;在主線程中不使用join方法以免不能立即處理訊號
2.使用全域性變數標誌是否應該退出主線程,需要在訊號處理程式中根據接收的訊號改變全域性變數的值
3.配置所有執行緒為daemon:主線程退出則整個程序退出
demo4:開啟多執行緒,ctrl+c即退出程式
def foo():
print(123)
time.sleep(1)
print("end123")
def bar(para):
print("start thread:{}".format(para))
time.sleep(10)
print("end thread:{}".format(para))
def handler(signum, frame):
global is_exit
is_exit = true
print("receive a signal , is_exit = ".format(signum, is_exit))
if __name__ == '__main__':
signal.signal(signal.sigint, handler)
signal.signal(signal.sigterm, handler)
ths =
global is_exit
is_exit = false
for i in range(10):
t=thread(target=bar,args=(i,))
t.daemon = true
for item in ths:
item.start()
while 1:
print('*****=', is_exit)
alive = false
for item in ths:
alive = alive or item.isalive()
if not alive or is_exit:
break
time.sleep(1)
print('main end')
python多執行緒 python多執行緒
通常來說,多程序適用於計算密集型任務,多執行緒適用於io密集型任務,如網路爬蟲。關於多執行緒和多程序的區別,請參考這個 下面將使用python標準庫的multiprocessing包來嘗試多執行緒的操作,在python中呼叫多執行緒要使用multiprocessing.dummy,如果是多程序則去掉...
python多執行緒詳解 Python多執行緒詳解
前言 由於最近的工作中一直需要用到python去處理資料,而在面對大量的資料時,python多執行緒的優勢就展現出來了。因而藉此機會,盡可能詳盡地來闡述python多執行緒。但對於其更底層的實現機制,在此不做深究,僅是對於之前的一知半解做個補充,也希望初學者能夠通過這篇文章,即便是照葫蘆畫瓢,也能夠...
python程式多執行緒 PYTHON多執行緒
在單執行緒的情況下,程式是逐條指令順序執行的。同一時間只做乙個任務,完成了乙個任務再進行下乙個任務。比如有5個人吃飯,單執行緒一次只允許乙個人吃,乙個人吃完了另乙個人才能接著吃,假如每個人吃飯都需要1分鐘,5個人就需要5分鐘。多執行緒的情況下,程式就會同時進行多個任務,雖然在同一時刻也只能執行某個任...