文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何杀死一个Python线程

2024-12-02 17:10

关注

 我经常被问到如何杀死一个后台线程,这个问题的答案让很多人不开心: 线程是杀不死的。在本文中,我将向您展示 Python 中用于终止线程的两个选项。

如果我们是一个好奇宝宝的话,可能会遇到这样一个问题,就是:如何杀死一个 Python 的后台线程呢?我们可能尝试解决这个问题,却发现线程是杀不死的。而本文中将展示,在 Python 中用于终止线程的两个方式。

1. 线程无法结束

A Threaded Example

  1. import random  
  2. import threading  
  3. import time  
  4. def bg_thread():  
  5.     for i in range(1, 30):  
  6.         print(f'{i} of 30 iterations...')  
  7.         time.sleep(random.random())  # do some work...  
  8.     print(f'{i} iterations completed before exiting.')  
  9. th = threading.Thread(target=bg_thread 
  10. th.start()  
  11. th.join() 
  1. $ python thread.py  
  2. 1 of 30 iterations...  
  3. 2 of 30 iterations...  
  4. 3 of 30 iterations...  
  5. 4 of 30 iterations...  
  6. 5 of 30 iterations...  
  7. 6 of 30 iterations...  
  8. 7 of 30 iterations...  
  9. ^CTraceback (most recent call last):  
  10.   File "thread.py", line 14, in <module>  
  11.     th.join()  
  12.   File "/Users/mgrinberg/.pyenv/versions/3.8.6/lib/python3.8/threading.py", line 1011, in join  
  13.     self._wait_for_tstate_lock()  
  14.   File "/Users/mgrinberg/.pyenv/versions/3.8.6/lib/python3.8/threading.py", line 1027, in _wait_for_tstate_lock  
  15.     elif lock.acquire(block, timeout):  
  16. KeyboardInterrupt  
  17. 8 of 30 iterations...  
  18. 9 of 30 iterations...  
  19. 10 of 30 iterations...  
  20. 11 of 30 iterations...  
  21. 12 of 30 iterations...  
  22. 13 of 30 iterations...  
  23. ^CException ignored in: <module 'threading' from '/Users/mgrinberg/.pyenv/versions/3.8.6/lib/python3.8/threading.py'>  
  24. Traceback (most recent call last):  
  25.   File "/Users/mgrinberg/.pyenv/versions/3.8.6/lib/python3.8/threading.py", line 1388, in _shutdown  
  26.     lock.acquire()  
  27. KeyboardInterrupt: 

2. 使用守护进程

Daemon Threads

  1. import random  
  2. import threading  
  3. import time  
  4. def bg_thread():  
  5.     for i in range(1, 30):  
  6.         print(f'{i} of 30 iterations...')  
  7.         time.sleep(random.random())  # do some work...  
  8.     print(f'{i} iterations completed before exiting.')  
  9. th = threading.Thread(target=bg_thread 
  10. th.daemon = True  
  11. th.start()  
  12. th.join() 
  1. ~ $ python x.py  
  2. 1 of 30 iterations...  
  3. 2 of 30 iterations...  
  4. 3 of 30 iterations...  
  5. 4 of 30 iterations...  
  6. 5 of 30 iterations...  
  7. 6 of 30 iterations...  
  8. ^CTraceback (most recent call last):  
  9.   File "thread.py", line 15, in <module>  
  10.     th.join()  
  11.   File "/Users/mgrinberg/.pyenv/versions/3.8.6/lib/python3.8/threading.py", line 1011, in join  
  12.     self._wait_for_tstate_lock()  
  13.   File "/Users/mgrinberg/.pyenv/versions/3.8.6/lib/python3.8/threading.py", line 1027, in _wait_for_tstate_lock  
  14.     elif lock.acquire(block, timeout):  
  15. KeyboardInterrupt 

3. 使用事件对象

Python Events

Event 类是由 Python 标准库的线程模块提供,你可以通过实例化类来创建一个事件对象,就像下面这个样子: 

  1. exit_event = threading.Event() 
  1. import random  
  2. import signal  
  3. import threading  
  4. import time  
  5. exit_event = threading.Event()  
  6. def bg_thread():  
  7.     for i in range(1, 30):  
  8.         print(f'{i} of 30 iterations...')  
  9.         time.sleep(random.random())  # do some work...  
  10.         if exit_event.is_set():  
  11.             break 
  12.      print(f'{i} iterations completed before exiting.')    
  13. def signal_handler(signum, frame):  
  14.     exit_event.set()  
  15. signal.signal(signal.SIGINT, signal_handler)  
  16. th = threading.Thread(target=bg_thread 
  17. th.start()  
  18. th.join() 
  1. $ python thread.py  
  2. 1 of 30 iterations...  
  3. 2 of 30 iterations...  
  4. 3 of 30 iterations...  
  5. 4 of 30 iterations...  
  6. 5 of 30 iterations...  
  7. 6 of 30 iterations...  
  8. 7 of 30 iterations...  
  9. ^C7 iterations completed before exiting. 
  1. for i in range(1, 30):  
  2.     print(f'{i} of 30 iterations...')  
  3.     time.sleep(random.random())  
  4.     if exit_event.is_set():  
  5.         break 
  1. for i in range(1, 30):  
  2.      print(f'{i} of 30 iterations...')  
  3.      if exit_event.wait(timeout=random.random()):  
  4.          break          

4. 总结陈述说明

Conclusion

 

来源:马哥Linux运维内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯