美文网首页Python
python 优雅的中止任务

python 优雅的中止任务

作者: alue | 来源:发表于2022-09-20 20:10 被阅读0次

例如,我们有一个耗时任务 task

def task():
    while True:
        print(f'task is running!')
        time.sleep(1)

在主线程,可以根据用户输入,随时中止该任务。
一种容易出错的写法是这样:

import threading
import sys

t1 = threading.Thread(target=task)
t1.start()
while True:
    code = input()
    if code == 'stop':
        sys.exit()
    print(code)

当主程序执行到 sys.exit() 时,屏幕上仍然不断打印 task is running!, 只是shell不再接收用户的输入了。这说明,task 线程仍然在运行,阻碍了主程序的退出。

原因是,Python中,非daemon线程并不会随着主线程的退出而退出,daemon 线程则会随着主线程的退出而被杀死。

所以一个简单的改变,让task对应的线程变成deamon线程即可。增加一行代码

t1.daemon = True # 设置线程t1为deamon 线程,则t1会随着 sys.exit() 而死去

不过,这里是强制杀死t1线程,其调用的资源可能不会被正确的释放,因此会导致诡异bug。因此,不推荐这样使用。

更推荐的是使用进程的方式,来管理任务。

import multiprocessing

if __name__ == "__main__":
    process = multiprocessing.Process(target=task)
    process.daemon = True # 这样主进程退出后,task进程也会退出,跟线程类似  a daemonic process is not allowed to create child processes. 
    process.start()

    while True:
        code = input()
        if code == 'stop':
            process.terminate()
            sys.exit()

这是因为,线程之间会共享全局变量,但进程之间是完全隔离的执行环境,所以关闭进程要比关闭线程安全很多。

相关文章

  • python 优雅的中止任务

    例如,我们有一个耗时任务 task 在主线程,可以根据用户输入,随时中止该任务。一种容易出错的写法是这样: 当主程...

  • 如何优雅地中止线程?

    本文来学习如何学习优雅地中止线程?通过 Java 线程的生老病死的学习,我相信大家对线程的运行以及线程的状态有一定...

  • 线程的中止和任务的取消

    要使任务和线程能安全,快速,可靠地停止下来,并不是一件容易的事情.Java没有提供任何机制来安全地终止线程.但是它...

  • Python threading 中join()的作用

    Python中join()的作用:(菜鸟网络)join([time]): 等待至线程中止。这阻塞调用线程直至线程的...

  • Python ThreadPoolExecutor 异常中止解决

    1. 原始方案 通常情况,我们利用 Ctrl+C 让程序触发 KeyboardInterrupt 异常,中止程序运...

  • 优雅的python

    1、交换赋值 ##不推荐 temp = a a = b b = a ##推荐 a, b = b, a # 先生成...

  • 优雅的python

    暂时只做笔记,后续整理 更新一些小技巧:自动给数字前补0参考:https://www.cnblogs.com/zh...

  • Python学习--慕课笔记

    Day One Python特点:优雅明确简单 Python适合领域:Web 脚本 “胶水工具” Python不适...

  • 个人2017年度复盘

    一.前言 首先得自我批评一下,一年了python依然没多大长进,当时中止学习python,是因为工作中用到的全是j...

  • 第一章 走进python

    《用python玩转数据》学习笔记 1 1、python简介 (1)python的特点:优雅、明确、简单;(2)p...

网友评论

    本文标题:python 优雅的中止任务

    本文链接:https://www.haomeiwen.com/subject/liyvortx.html