A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

什么是守护线程?什么是非守护线程?什么是线程同步?
文章目标:搞懂Python中的上面三个问题
非守护线程
线程概念
当一个进程启动以后,默认会产生一个主线程,因为线程是程序执行的最小单位,在Python当中线程默认情况下就是setDaemon(False)(非守护线程),也就是主线程执行完自己的任务退出以后,子线程会继续执行自己的任务,不会随主线程退出受影响
案例
[Python] 纯文本查看 复制代码
import threading
import time


def run():
    time.sleep(2)  # 延时等待2s
    print('---子线程结束执行---')


def main():
    t1 = threading.Thread(target=run)
    t1.start()
    print('---主线程结束执行---')


if __name__ == '__main__':
    main()

输出
[Python] 纯文本查看 复制代码
---主线程结束执行---
---子线程结束执行---

总结:非守护线程,子线程不随主线程结束而立马结束,而是继续执行
守护线程

当守护线程时,子线程会守护主线程,主线程一旦退出,全部子线程都会被强制终止
案例
[Python] 纯文本查看 复制代码
import threading
import time


def run():
    time.sleep(2)
    print('---子线程结束---')


def main():
    t1 = threading.Thread(target=run)
    t1.setDaemon(True)  # 设置子线程守护主线程
    t1.start()
    print('---主线程结束---')


if __name__ == '__main__':
    main()

输出
[Python] 纯文本查看 复制代码
---主线程结束---

线程同步

线程同步就是让线程处于堵塞状态,等待子线程执行以后主线程再执行,也可以设置堵塞时间
案例(主线程堵塞,等待子线程结束以后再执行)
[Python] 纯文本查看 复制代码
import threading
import time


def run():
    time.sleep(2)
    print('---子线程结束---')


def main():
    t1 = threading.Thread(target=run)
    t1.start()
    t1.join()  # 主线程堵塞
    print('---主线程结束---')


if __name__ == '__main__':
    main()

输出
[Python] 纯文本查看 复制代码
---子线程结束---
---主线程结束---

案例(主线程堵塞1s,主线程继续执行)
[Python] 纯文本查看 复制代码
import threading
import time


def run():
    time.sleep(2)
    print('---子线程结束---')


def main():
    t1 = threading.Thread(target=run)
    t1.start()
    t1.join(timeout=1)  # 主线程堵塞1s
    print('---主线程结束---')


if __name__ == '__main__':
    main()

输出
[Python] 纯文本查看 复制代码
---主线程结束---
---子线程结束---





0 个回复

您需要登录后才可以回帖 登录 | 加入黑马