Python-主线程控制子线程结束-2

这篇具有很好参考价值的文章主要介绍了Python-主线程控制子线程结束-2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求:主线程创建工作子线程和键盘输入监听子线程。
           当用户输入 '0' 后, 工作子线程会收到停止信号并退出,此时键盘输入监听线程仍然运行;
           当用户输入 '1' 后,会建立新的工作子线程;
           当用户输入 '2' 后,整个程序退出。

import threading
import time
from loguru import logger

exit = False


class WorkerThread(threading.Thread):
    def __init__(self):
        super().__init__()
        self.stop_event = threading.Event()

    def run(self):
        thread_id = threading.get_ident()
        print(f"Worker thread {thread_id} has started.")
        while not self.stop_event.is_set():
            print(f"Worker thread {thread_id} is running.")
            time.sleep(1)
        print(f"Worker thread {thread_id} has stopped.")

    def stop(self):
        self.stop_event.set()
        self.join()  # 等待子线程结束


def end_child_thread():
    try:
        if worker_thread.is_alive():
            worker_thread.stop()
            logger.info(f"Stopping worker thread {worker_thread.ident}...")
            if worker_thread.is_alive():
                logger.info(f"Worker thread {worker_thread.ident} is still active")
        else:
            logger.info(f"Worker thread {worker_thread.ident} doesn't exist ..")
    except Exception as e:
        logger.info("中止线程失败:" + e)


def key_listener():
    keyboard_thread_id = threading.get_ident()  # 获取键盘监听线程的ID
    global worker_thread  # 声明为全局变量
    global exit
    print("""
    Press '0' to stop worker thread, 
          '1' to start a new worker thread,
          '2' to end the program.
    ...""")
    while True:
        print(f"Keyboard listener thread {keyboard_thread_id} has started.")
        command = input("请输入指令~")
        if command == '0':
            logger.info(f"工作线程状态{worker_thread}")
            end_child_thread()
            logger.info(f"工作线程状态{worker_thread}")
        elif command == '1':
            try:
                if worker_thread.is_alive():
                    pass
                else:
                    worker_thread = WorkerThread()
                    worker_thread.start()
                    logger.info(f"Started new worker thread {worker_thread.ident}")
            except Exception as e:
                logger.info("新建工作线程失败:" + e)
        elif command == '2':
            end_child_thread()
            exit = True
            break
        else:
            pass
        time.sleep(0.1)


if __name__ == '__main__':
    main_thread_id = threading.main_thread().ident
    logger.info(f"Main thread {main_thread_id} has started~")

    worker_thread = WorkerThread()
    keyboard_thread = threading.Thread(target=key_listener) # 创建键盘输入监听线程

    keyboard_thread.start()     # 启动键盘输入监听线程
    worker_thread.start()

    logger.info(f"Keyboard monitor thread {keyboard_thread.ident} has started~")
    logger.info(f"worker thread {worker_thread.ident} has started~")

    try:
        while not exit:
            pass
    except:
        print("手动停止程序...")
        worker_thread.stop()  # 在主线程退出时停止子线程
        worker_thread.join()  # 等待子线程结束

    print('exit')

    # 主线程退出
    logger.info(f"Main thread {main_thread_id} is exiting~")

运行效果: 

Python-主线程控制子线程结束-2,python,多线程

 Python-主线程控制子线程结束-2,python,多线程

 文章来源地址https://www.toymoban.com/news/detail-664606.html

到了这里,关于Python-主线程控制子线程结束-2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用python的subprocess执行命令、交互、等待、是否结束、解析JSON结果

    Python的subprocess模块提供了一种在Python中调用外部命令的方法。它允许您在Python程序中启动新进程,连接到它们的输入/输出/错误管道,并等待它们完成。 下面是一些subprocess模块的常用用法: 运行外部命令并获取输出: 运行外部命令并获取返回值: 运行外部命令并将输出重

    2024年02月08日
    浏览(52)
  • C# task多线程创建,暂停,继续,结束使用

    1、多线程任务创建 2、线程暂停 3、线程继续 4、取消线程 完整版代码如下: 软件界面如下

    2024年02月11日
    浏览(35)
  • Python运行selenium程序执行结束后自动关闭浏览器 解决方法 亲测有效

    最近朋友在学Selenium的时候遇到一个问题,当执行完selenium程序后,浏览器会闪退也就是自动关闭,程序中也没有写driver.quit()或driver.close()方法,解决后发布上来以供学习交流。 内容比较简单,这里直接附上代码: (1)修改前 (2)修改后:

    2024年02月11日
    浏览(48)
  • python 从键盘输入若干个整数,当输入“-1““时输入结束,请统计最大值、最小值和平均数

    python 从键盘输入若干个整数,当输入\\\"-1\\\"\\\"时输入结束,请统计最大值、最小值和平均数 上面题目代码如下: 第一种方法列表方法求: 第二种方法,冒泡排序算法求得 代码中,考虑到-1这种情况,做了如下处理:

    2024年02月06日
    浏览(33)
  • python运行selenium创建Edge浏览器更改默认下载路径的方法与防止程序结束后浏览器窗口自动关闭的方法

    结合chatgpt与csdn查阅资料后 得到解决方法: 其中 “D:Downloads_test”改为你自己想要默认下载路径, \\\"download.prompt_for_download\\\"为下载文件开始时Edge浏览器是否弹出另存为窗口,True则触发下载时会弹出另存为窗口,False则直接将文件下载到默认下载路径中。 另存为窗口长相如下

    2024年02月11日
    浏览(33)
  • Python的多线程,守护线程,线程安全_python多线程安全

    #(1) 一个进程里包含了多个线程,线程之间是异步并发 from threading import Thread from multiprocessing import Process import os , time , random def func(i): time.sleep(random.uniform(0.1,0.9)) print(“当前进程号:{}”.format(os.getpid()) , i) if name == “__main__”: #线程里面这句话可以不加 for i in range(10): t = Thread(t

    2024年04月09日
    浏览(26)
  • 【C#实战】控制台游戏 勇士斗恶龙(3)——营救公主以及结束界面

    君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,最近开始正式的步入学习游戏开发的正轨,想要通过写博客的方式来分享自己学到的知识和经验,这就是开设本专栏的目的。希望这些独立的C#小项目能对做游戏的你有所帮助,

    2024年02月09日
    浏览(39)
  • 37.Python从入门到精通—Python3 多线程 线程模块 使用 threading 模块创建线程

    在Python 3中,线程模块已被重命名为_thread,同时还引入了更高级别的 threading 模块,它允许创建线程对象并提供了更多的方法来控制线程的行为。 以下是一个简单的示例,演示如何使用 threading 模块创建并启动线程: 在这个例子中,我们创建了一个名为 print_numbers 的函数,它

    2024年04月26日
    浏览(33)
  • 「Python系列」Python 多线程

    在Python中,多线程编程意味着同时使用多个线程来执行代码。Python的标准库提供了 threading 模块来支持多线程编程。线程是程序执行流的最小单元,它是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资

    2024年04月12日
    浏览(16)
  • Python多线程与线程池(python线程池ThreadPoolExecutor)concurrent.futures高级别异步执行封装

    在进行复杂的计算或处理大量数据时,可以通过创建多个线程来同时执行多个任务,从而提高程序的执行效率。这种技术称为多线程编程。 1.1 线程简介 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一

    2024年02月12日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包