python 多執行緒不響應ctrl c

2021-10-17 04:16:16 字數 3035 閱讀 7146

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分鐘。多執行緒的情況下,程式就會同時進行多個任務,雖然在同一時刻也只能執行某個任...