python多线程----------主线程,子线程,任务讲解----拿下就是胜利

简介: python多线程----------主线程,子线程,任务讲解----拿下就是胜利

这一篇博客主要介绍给分不清楚主线程.子线程的小可爱们

在之前的一篇博客中我简单的介绍了并发,并行

并发:是在时段的完成多个任务 ,但是每个时间点只有一个任务运行

而多线程就是这一个原理

守护线程

代码:

from threading import Thread
import requests
from selenium import webdriver
import time
# 并发 cpu数量小于执行任务数量 比如一个cpu运行多个进程
# 并行 cpu数量大于任务数量, 比如4个cpu运行4个进程
def sing():
    # 子线程
    for i in range(5):
        print("我是打打怪")
def dance():
    # 任务
    # for i in range(5):
    #     print("我是小小怪")
    #     time.sleep(1)
    print("11")
    print("22")
    time.sleep(1)
    print("33")
"""主线程"""
if __name__ == '__main__':
    a = time.time()
    # 创建5个子线程,每个子线程都发送一次dance()任务,非守护线程不会等待主线程运行结束而结束,而守护停止是在主线程和非守护运行完成后停止
    for i in range(5):
        t1 = Thread(target=dance)
        # 线程创建按完成
        t1.start()
    b = time.time()
    print(b - a)

结果:

可以看出主线程执行完成,但是子线程还在运行,这就是非守护线程(子线程),

非守护线程:就是主线程运行结束,还在运行,知道自己调用的函数运行完成(任务运行完成)

对于非守护线程,就算主线程执行完了,也要等非守护进程完成才能退出

守护线程

代码:

from threading import Thread
import requests
from selenium import webdriver
import time
# 并发 cpu数量小于执行任务数量 比如一个cpu运行多个进程
# 并行 cpu数量大于任务数量, 比如4个cpu运行4个进程
def sing():
    # 子线程
    for i in range(5):
        print("我是打打怪")
        time.sleep(5)
        print("子线程(守护)运行")
def dance():
    # 任务
    # for i in range(5):
    #     print("我是小小怪")
    #     time.sleep(1)
    print("11")
    time.sleep(1)
    print("子线程(非守护)运行")
"""主线程"""
if __name__ == '__main__':
    a = time.time()
    # 创建5个子线程,每个子线程都发送一次dance()任务,非守护线程不会等待主线程运行结束而结束,而守护停止是在主线程和非守护运行完成后停止
    for i in range(5):
        t1 = Thread(target=dance)
        # 线程创建按完成
        t1.start()
    for i in range(5):
        t2 = Thread(target=sing)
        t2.setDaemon(True)
        t2.start()
    b = time.time()
    print(b - a)

结果:

守护线程:要么自己运行在主线程或非守护线程前结束,要么等主线程或非守护线程结束,然后自己被强制行结束

子线程其实就是并发(同一时间段内执行多个操作)的任务;但本人理解为主线程里面有子线程,通过子线程来执行任务,任务就是我们定义的函数

setDaemon(Ture) :设置子进程为守护进程 ==  主进程关闭,子进程随即关闭【当你觉得一些线程不重要的时候,可以设置守护线程。】

Join() :设置阻塞 == 该子进程执行完才能执行主线程【当一些任务要先于另一些任务完成的时候,可以用】

这里就不介绍了

总结:这里是给分不清楚主线程和子线程的小可爱的,

相关文章
|
2月前
|
存储 Java 数据库
如何处理线程池关闭时未完成的任务?
总之,处理线程池关闭时未完成的任务需要综合考虑多种因素,并根据实际情况选择合适的处理方式。通过合理的处理,可以最大程度地减少任务丢失和数据不一致等问题,确保系统的稳定运行和业务的顺利开展。
127 64
|
2月前
|
消息中间件 监控 Java
线程池关闭时未完成的任务如何保证数据的一致性?
保证线程池关闭时未完成任务的数据一致性需要综合运用多种方法和机制。通过备份与恢复、事务管理、任务状态记录与恢复、数据同步与协调、错误处理与补偿、监控与预警等手段的结合,以及结合具体业务场景进行分析和制定策略,能够最大程度地确保数据的一致性,保障系统的稳定运行和业务的顺利开展。同时,不断地优化和改进这些方法和机制,也是提高系统性能和可靠性的重要途径。
125 62
|
26天前
|
数据采集 存储 监控
21个Python脚本自动执行日常任务(2)
21个Python脚本自动执行日常任务(2)
84 7
21个Python脚本自动执行日常任务(2)
|
30天前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
49 18
|
2月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
57 12
|
1月前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
2月前
|
数据采集 存储 数据处理
Python中的多线程编程及其在数据处理中的应用
本文深入探讨了Python中多线程编程的概念、原理和实现方法,并详细介绍了其在数据处理领域的应用。通过对比单线程与多线程的性能差异,展示了多线程编程在提升程序运行效率方面的显著优势。文章还提供了实际案例,帮助读者更好地理解和掌握多线程编程技术。
|
2月前
|
运维 监控 网络安全
自动化运维的崛起:如何利用Python脚本简化日常任务
【10月更文挑战第43天】在数字化时代的浪潮中,运维工作已从繁琐的手工操作转变为高效的自动化流程。本文将引导您了解如何运用Python编写脚本,以实现日常运维任务的自动化,从而提升工作效率和准确性。我们将通过一个实际案例,展示如何使用Python来自动部署应用、监控服务器状态并生成报告。文章不仅适合运维新手入门,也能为有经验的运维工程师提供新的视角和灵感。
|
2月前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
2月前
|
调度 数据库 Python
掌握Python中的异步编程,提升I/O密集型任务的性能
掌握Python中的异步编程,提升I/O密集型任务的性能
47 0