黄视频网站在线免费观看-黄视频网站在线看-黄视频网站在线观看-黄视频网站免费看-黄视频网站免费观看-黄视频网站免费

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時隨地免費學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時隨地免費學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > 如何殺死一個Python線程

如何殺死一個Python線程

來源:千鋒教育
發(fā)布人:xqq
時間: 2023-11-07 02:56:44 1699297004

我經(jīng)常被問到如何殺死一個后臺線程,這個問題的答案讓很多人不開心:線程是殺不死的。在本文中,我將向您展示Python中用于終止線程的兩個選項。

如果我們是一個好奇寶寶的話,可能會遇到這樣一個問題,就是:如何殺死一個Python的后臺線程呢?我們可能嘗試解決這個問題,卻發(fā)現(xiàn)線程是殺不死的。而本文中將展示,在Python中用于終止線程的兩個方式。

1.線程無法結(jié)束

·AThreadedExample

下面是一個簡單的,多線程的示例代碼。

importrandom

importthreading

importtime

defbg_thread():

foriinrange(1,30):

print(f'{i}of30iterations...')

time.sleep(random.random())#dosomework...

print(f'{i}iterationscompletedbeforeexiting.')

th=threading.Thread(target=bg_thread)

th.start()

th.join()

使用下面命令來運行程序,在下面的程序運行中,當(dāng)跑到第7次迭代時,按下Ctrl-C來中斷程序,發(fā)現(xiàn)后臺運行的程序并沒有終止掉。而在第13次迭代時,再次按下Ctrl-C來中斷程序,發(fā)現(xiàn)程序真的退出了。

$pythonthread.py

1of30iterations...

2of30iterations...

3of30iterations...

4of30iterations...

5of30iterations...

6of30iterations...

7of30iterations...

^CTraceback(mostrecentcalllast):

File"thread.py",line14,in

th.join()

File"/Users/mgrinberg/.pyenv/versions/3.8.6/lib/python3.8/threading.py",line1011,injoin

self._wait_for_tstate_lock()

File"/Users/mgrinberg/.pyenv/versions/3.8.6/lib/python3.8/threading.py",line1027,in_wait_for_tstate_lock

eliflock.acquire(block,timeout):

KeyboardInterrupt

8of30iterations...

9of30iterations...

10of30iterations...

11of30iterations...

12of30iterations...

13of30iterations...

^CExceptionignoredin:

Traceback(mostrecentcalllast):

File"/Users/mgrinberg/.pyenv/versions/3.8.6/lib/python3.8/threading.py",line1388,in_shutdown

lock.acquire()

KeyboardInterrupt:

這很奇怪,不是嗎?究其原因是,Python有一些邏輯是會在進(jìn)程退出前運行的,專門用來等待任何沒有被配置為守護(hù)線程的后臺線程結(jié)束,然后再把控制權(quán)真正交給操作系統(tǒng)。因此,該進(jìn)程在其主線程運行時收到到了中斷信號,并準(zhǔn)備退出。首先,它需要等待后臺線程運行結(jié)束。但是,這個線程對中斷一無所知,這個線程只知道它需要在運行結(jié)束前完成30次迭代。

Python在退出過程中使用的等待機(jī)制有一個規(guī)定,當(dāng)收到第二個中斷信號時,就會中止。這就是為什么第二個Ctrl-C會立即結(jié)束進(jìn)程。所以我們看到了,線程是不能被殺死!在下面的章節(jié)中,將向展示Python中的兩個方式,來使線程及時結(jié)束。

2.使用守護(hù)進(jìn)程

·DaemonThreads

在上面提到過,在Python退出之前,它會等待任何非守護(hù)線程的線程。而守護(hù)線程就是,一個不會阻止Python解釋器退出的線程。

如何使一個線程成為一個守護(hù)線程?所有的線程對象都有一個daemon屬性,可以在啟動線程之前將這個屬性設(shè)置為True,然后該線程就會被視為一個守護(hù)線程。下面是上面的示例應(yīng)用程序,修改后守護(hù)線程版本:

importrandom

importthreading

importtime

defbg_thread():

foriinrange(1,30):

print(f'{i}of30iterations...')

time.sleep(random.random())#dosomework...

print(f'{i}iterationscompletedbeforeexiting.')

th=threading.Thread(target=bg_thread)

th.daemon=True

th.start()

th.join()

再次運行它,并嘗試中斷它,發(fā)現(xiàn)第一個執(zhí)行Ctrl-C后進(jìn)程立即就退出了。

~$pythonx.py

1of30iterations...

2of30iterations...

3of30iterations...

4of30iterations...

5of30iterations...

6of30iterations...

^CTraceback(mostrecentcalllast):

File"thread.py",line15,in

th.join()

File"/Users/mgrinberg/.pyenv/versions/3.8.6/lib/python3.8/threading.py",line1011,injoin

self._wait_for_tstate_lock()

File"/Users/mgrinberg/.pyenv/versions/3.8.6/lib/python3.8/threading.py",line1027,in_wait_for_tstate_lock

eliflock.acquire(block,timeout):

KeyboardInterrupt

那么這個線程會發(fā)生什么呢?線程繼續(xù)運行,就像什么都沒發(fā)生一樣,直到Python進(jìn)程終止并返回到操作系統(tǒng)。這時,線程就不存在了。你可能認(rèn)為這實際上是一種殺死線程的方法,但要考慮到以這種方式殺死線程,你必須同時殺死進(jìn)程。

3.使用事件對象

·PythonEvents

使用守護(hù)線程,是一種避免在多線程程序中處理意外中斷的簡單方法,但這是一種只在進(jìn)程退出的特殊情況下才有效的技巧。不幸的是,有些時候,一個應(yīng)用程序可能想結(jié)束一個線程而不必殺死自己。另外,有些線程可能需要在退出前執(zhí)行清理工作,而守護(hù)線程則不允許這樣操作。

那么,還有什么其他選擇呢?既然不可能強(qiáng)制線程結(jié)束,那么唯一的選擇就是給它添加邏輯,讓它在被要求退出時自愿退出。有多種方法都可以解決上述問題,但我特別喜歡的一種方法,就是使用一個Event對象。

Event類是由Python標(biāo)準(zhǔn)庫的線程模塊提供,你可以通過實例化類來創(chuàng)建一個事件對象,就像下面這個樣子:

exit_event=threading.Event()

Event對象可以處于兩種狀態(tài)之一:set或notset。當(dāng)我們實例化創(chuàng)建之后,默認(rèn)事件并沒有被設(shè)置。

·若要將事件狀態(tài)更改為set,則可以調(diào)用set()方法;

·要查明是否設(shè)置了事件,使用is_set()方法,設(shè)置了則返回True;

·還可以使用wait()方法等待事件,等待操作阻塞直到設(shè)置事件(可以設(shè)置超時)

其核心思路,就是在線程需要退出的時候設(shè)置事件。然后,線程需要經(jīng)常地檢查事件的狀態(tài)(通常是在循環(huán)中),并在發(fā)現(xiàn)事件已經(jīng)設(shè)置時處理自己的終止。對于上面顯示的示例,一個好的解決方案是添加一個捕獲Ctrl-C中斷的信號處理程序,而不是突然退出,只需設(shè)置事件并讓線程優(yōu)雅地結(jié)束。

importrandom

importsignal

importthreading

importtime

exit_event=threading.Event()

defbg_thread():

foriinrange(1,30):

print(f'{i}of30iterations...')

time.sleep(random.random())#dosomework...

ifexit_event.is_set():

break

print(f'{i}iterationscompletedbeforeexiting.')

defsignal_handler(signum,frame):

exit_event.set()

signal.signal(signal.SIGINT,signal_handler)

th=threading.Thread(target=bg_thread)

th.start()

th.join()

如果你嘗試中斷這個版本的應(yīng)用程序,一切看起來都會更好:

$pythonthread.py

1of30iterations...

2of30iterations...

3of30iterations...

4of30iterations...

5of30iterations...

6of30iterations...

7of30iterations...

^C7iterationscompletedbeforeexiting.

需要注意的是,中斷是如何被優(yōu)雅地處理的,以及線程能夠運行在循環(huán)之后出現(xiàn)的代碼。如果當(dāng)線程需要在退出之前,關(guān)閉文件句柄或數(shù)據(jù)庫連接時,這種方式就非常有用了。其能夠在線程退出之前,運行清理代碼有時是必要的,以避免資源泄漏。我在上面提到過,event對象也是可以等待的:

foriinrange(1,30):

print(f'{i}of30iterations...')

time.sleep(random.random())

ifexit_event.is_set():

break

在每個迭代中,都有一個對time.sleep()的調(diào)用,這將阻塞線程。如果在線程sleep時設(shè)置了退出事件,那么它就不能檢查事件的狀態(tài),因此在線程能夠退出之前會有一個小的延遲。在這種情況下,如果有sleep,使用wait()方法將sleep與event對象的檢查結(jié)合起來會更有效:

foriinrange(1,30):

print(f'{i}of30iterations...')

ifexit_event.wait(timeout=random.random()):

break

這個解決方案有效地為提供了一個可中斷的sleep,因為在線程停留在wait()調(diào)用的中間時設(shè)置了事件,那么等待將立即返回。

4.總結(jié)陳述說明

·Conclusion

你知道Python中的event對象嗎?它們是比較簡單的同步原語之一,不僅可以用作退出信號,而且在線程需要等待某些外部條件發(fā)生的許多其他情況下也可以使用。

以上內(nèi)容為大家介紹了如何殺死一個Python線程,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://www.e7g2kmi.cn/

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(nèi)將與您1V1溝通
免費領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
精品视频免费观看| 九九久久国产精品| 久久国产一久久高清| 久久久久久久免费视频| 国产91丝袜高跟系列| 日韩综合| 免费的黄色小视频| 欧美激情一区二区三区在线| 色综合久久天天综线观看 | 国产a一级| 欧美一级视频免费| 久久成人亚洲| 九九免费精品视频| 日本免费看视频| 国产国语对白一级毛片| 日韩免费在线| 一 级 黄 中国色 片| 可以免费在线看黄的网站| 一级女性全黄生活片免费| | 精品国产一区二区三区久| 精品在线视频播放| 国产一区国产二区国产三区| 欧美国产日韩一区二区三区| 成人影院一区二区三区| 精品国产亚洲人成在线| 成人免费一级纶理片| 亚洲天堂免费观看| 国产麻豆精品hdvideoss| 国产a毛片| 国产91精品露脸国语对白| 九九九网站| 久久精品道一区二区三区| 一级女性大黄生活片免费| 99久久精品国产麻豆| 999精品在线| 亚洲 男人 天堂| 精品国产一区二区三区国产馆| 国产视频一区在线| 免费一级片在线观看| 久久国产精品自线拍免费| 97视频免费在线观看| 日韩av东京社区男人的天堂| 国产麻豆精品免费密入口| 日日日夜夜操| 久久精品免视看国产成人2021| 亚洲精品影院| 久久久久久久免费视频| 国产网站免费观看| 午夜在线亚洲| 久久国产精品只做精品| 精品视频在线观看视频免费视频| 成人免费网站久久久| 国产91丝袜高跟系列| 天天色色色| 美女免费精品视频在线观看| 香蕉视频久久| 成人免费福利片在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 精品视频在线看| 国产成+人+综合+亚洲不卡| 四虎影视库| 日日爽天天| 欧美1区2区3区| 香蕉视频亚洲一级| 超级乱淫黄漫画免费| 九九九网站| 精品久久久久久综合网| 国产国语对白一级毛片| 免费一级片在线| 日本伦理片网站| 超级乱淫伦动漫| 天天色色色| 91麻豆国产| 国产精品免费久久| 成人a级高清视频在线观看| 日韩中文字幕一区| 精品视频一区二区三区| 国产美女在线一区二区三区| 日韩专区亚洲综合久久| 青青青草视频在线观看| 日韩男人天堂| 国产一区二区精品久久| 欧美激情一区二区三区在线播放 | 国产成人欧美一区二区三区的| 日本在线播放一区| 美女免费毛片| 日韩在线观看视频免费| 精品国产一区二区三区国产馆| 久久国产影视免费精品| 亚洲第一页乱| 午夜家庭影院| 欧美一级视频免费| 精品国产香蕉在线播出| 99热精品一区| 成人免费观看的视频黄页| 精品久久久久久综合网| 久久精品店| 国产精品自拍一区| 免费的黄色小视频| 中文字幕一区二区三区 精品| 午夜在线亚洲| 亚欧成人乱码一区二区| 日本在线播放一区| 99久久精品国产高清一区二区| 日日夜人人澡人人澡人人看免| 亚洲 国产精品 日韩| 国产麻豆精品hdvideoss| 国产网站在线| 精品视频在线观看免费| 国产视频一区在线| 精品视频一区二区三区免费| 九九免费高清在线观看视频| 亚洲第一色在线| 国产精品免费久久| 91麻豆tv| 国产成a人片在线观看视频| 国产伦久视频免费观看视频| 精品视频在线观看一区二区| 国产成人精品综合| 国产网站免费观看| 九九九网站| 成人免费一级纶理片| 国产91精品一区二区| 欧美激情中文字幕一区二区| 国产一区二区精品久久| 国产a毛片| 精品国产一区二区三区久| 99热视热频这里只有精品| 久久精品欧美一区二区| 国产综合91天堂亚洲国产| 日韩专区在线播放| 精品国产一区二区三区国产馆| 欧美激情在线精品video| 欧美18性精品| 久久精品店| 天堂网中文在线| 黄色免费三级| 国产视频在线免费观看| 日韩av成人| 欧美激情一区二区三区视频高清 | 九九干| 国产伦精品一区二区三区在线观看| 四虎影视久久| 九九精品影院| 欧美一级视频免费| 欧美日本免费| 日韩在线观看免费| 成人免费网站视频ww| 色综合久久天天综合绕观看| 你懂的国产精品| 国产福利免费观看| 在线观看成人网| 国产不卡在线观看| 欧美一区二区三区在线观看| 青青久久网| 精品久久久久久中文| 91麻豆精品国产片在线观看| 国产网站免费| 999精品在线| 色综合久久天天综合绕观看| 成人a大片在线观看| 黄视频网站在线免费观看| 国产综合91天堂亚洲国产| 国产成a人片在线观看视频| 免费一级片在线| 美女免费黄网站| 999精品影视在线观看| 国产91精品露脸国语对白| 精品久久久久久中文字幕一区| 国产伦久视频免费观看视频| 久久国产精品永久免费网站| 国产成人精品综合在线| a级黄色毛片免费播放视频| 美女免费毛片| 国产一区二区精品尤物| 日韩在线观看视频网站| 国产高清视频免费| 香蕉视频久久| 亚久久伊人精品青青草原2020| 日本免费区| 日韩av片免费播放| 国产伦精品一区二区三区在线观看| 成人免费一级毛片在线播放视频| 你懂的国产精品| 精品视频在线观看一区二区| 国产a一级| 欧美α片无限看在线观看免费| 国产成人精品影视| 久久99欧美| 国产精品自拍在线| 成人高清护士在线播放| 国产不卡高清| 天天做日日干| 国产a一级| 四虎影视库国产精品一区| 精品国产三级a∨在线观看| 成人免费一级毛片在线播放视频| 日韩av片免费播放| 精品久久久久久中文字幕一区|