首页 > 其他分享 >多线程threading模块(二)daemon和join的区别

多线程threading模块(二)daemon和join的区别

时间:2023-11-16 18:05:37浏览次数:42  
标签:daemon task join num 线程 time print 多线程

Python Version:3.10.12

案列一:最简洁的情况,在多线程代码中不开启daemon或join功能。

import threading
import time

loop_count = 5


def count_num(num):
    print('子线程<{}>开始运行'.format(num))

    for x in range(10):
        time.sleep(x)
    print('子线程<{}>结束运行'.format(num))
    return num


task_list = []
for i in range(loop_count):
    task = threading.Thread(target=count_num, args=(i,))
    task_list.append(task)

print('-'*20)
print('全部多线程开始')
start = time.time()
for task in task_list:
    # 开启多线程任务
    task.start()


print('全部多线程全部结束')
end = time.time()
ret = end - start
print('全部多线程耗时: {}'.format(ret))
print('### 主线程结束 ###')

运行结果来看,主线程和子线程是完全独立运行的,并不相互依存。默认行情况下,主进程结束并不影响子进程的运行

全部多线程开始  
子线程<0>开始运行
子线程<1>开始运行
子线程<2>开始运行
子线程<3>开始运行
子线程<4>开始运行   # 子线程全部启动
全部多线程全部结束  # 主线程继续向下运行,并不理会子线程的状态
全部多线程耗时: 0.0005412101745605469 
### 主线程结束 ###    # 主进程不涉及任何计算,所以很快就结束了


子线程<0>结束运行  # 主进程结束后,子线程继续运行至计算结束
子线程<4>结束运行
子线程<1>结束运行
子线程<2>结束运行
子线程<3>结束运行


案例二:在多线程代码中开启daemon

import threading
import time

loop_count = 5


def count_num(num):
    print('子线程<{}>开始运行'.format(num))

    for x in range(10):
        time.sleep(x)
    print('子线程<{}>结束运行'.format(num))
    return num


task_list = []
for i in range(loop_count):
    # 显式的标记 daemon=True 
    task = threading.Thread(target=count_num, args=(i,), daemon=True) 
    task_list.append(task)

print('-'*20)
print('全部多线程开始')
start = time.time()
for task in task_list:
    # 开启多线程任务
    task.start()


print('全部多线程全部结束')
end = time.time()
ret = end - start
print('全部多线程耗时: {}'.format(ret))
print('### 主线程结束 ###')

运行结果没有丢失内容,开启了daemon=True以后,子线程会随着主线程的结束而退出

全部多线程开始
子线程<0>开始运行
子线程<1>开始运行
子线程<2>开始运行
子线程<3>开始运行
子线程<4>开始运行
全部多线程全部结束
全部多线程耗时: 0.00020813941955566406
### 主线程结束 ###


场景三:在多线程代码中开启join

import threading
import time

loop_count = 5


def count_num(num):
    print('子线程<{}>开始运行'.format(num))

    for x in range(10):
        time.sleep(x)
    print('子线程<{}>结束运行'.format(num))
    return num


task_list = []
for i in range(loop_count):
    # 显式的标记 daemon=True 
    task = threading.Thread(target=count_num, args=(i,), daemon=True) 
    task_list.append(task)

print('-'*20)
print('全部多线程开始')
start = time.time()
for task in task_list:
    # 开启多线程任务
    task.start()
    task.join()    # 子线程配置一个join(),阻塞主线程下一次的for循环的运行。
                   # 因此当前子线程结束前,无法启动第二个子线程


print('全部多线程全部结束')
end = time.time()
ret = end - start
print('全部多线程耗时: {}'.format(ret))
print('### 主线程结束 ###')

运行结果与单线程类似,join()会阻塞主线程的运行。即当前的子线程start()运行结束前,主线程不会继续运行下面的代码。本例中,主线程通过for循环来启动子线程。当前的子线程start()运行后,紧跟着有使用了task.join()阻塞住了主线程继续循环启动下一个子线程的start()。因此整个程序运行流程就变成了一个一个顺序运行子线程,与单线程运行流程无异了。

全部多线程开始
子线程<0>开始运行
子线程<0>结束运行
子线程<1>开始运行
子线程<1>结束运行
子线程<2>开始运行
子线程<2>结束运行
子线程<3>开始运行
子线程<3>结束运行
子线程<4>开始运行
子线程<4>结束运行
全部多线程全部结束
全部多线程耗时: 225.15359783172607
### 主线程结束 ###


标签:daemon,task,join,num,线程,time,print,多线程
From: https://blog.51cto.com/830909/8429843

相关文章

  • 修改/etc/docker/daemon.json中的log-opts配置发现无效 docker 限制日志大小
    https://colobu.com/2018/10/22/no-space-left-on-device-for-docker/在/etc/docker/daemon.json中修改或添加log-opts参数"log-driver":"json-file","log-opts":{"max-size":"50m","max-file":"3"}网上很......
  • JavaSE day07-异常,多线程
    JavaSEday07-异常,多线程今日目标:异常的概述异常的分类异常的处理方式自定义异常多线程入门1异常的概述1.1什么是异常?异常就是程序出现了不正常情况,程序在执行过程中,数据导致程序不正常,最终导致了JVM的非正常停止注意:语句错误不算在异常体系中1.......
  • docker使用--gpus all报错: docker: Error response from daemon: could not select d
    报错信息:docker:Errorresponsefromdaemon:couldnotselectdevicedriver""withcapabilities:[[gpu]].解决方法:1,任意路径下创建nvidia-container-runtime-script.sh文件vimnvidia-container-runtime-script.sh拷贝下方内容到nvidia-container-runtime-script.......
  • Java 创建多线程的三种方法
    在Java中创建多线程,往往都要通过Thread类来实现,今天学习下Java中创建多线程的三种方法[1]。1.继承Thread类通过继承Thread类实现多线程。主要方法:1.voidrun(),线程开启后,方法将被调用执行2.voidstart(),使此线程开始执行,Java虚拟机会调用run()方法实现步骤:1.定......
  • Java 多线程安全的使用小结
    在使用多线程进行编程的过程中,难免遇到共享资源读写问题,这是为了线程安全,一种思路就是使用锁来控制并发读写问题。在通过锁来实现并发安全中,常用的有以下几种:synchronized,对象锁ReentrantLock,重入锁ReentrantReadWriteLock,读写锁今天从使用的角度来看看这几种锁是如何使......
  • Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docke
    docker-composeup-d安装docker环境,提示一下错误:docker-compose命令没发现。dockercompseup-d报错:CannotconnecttotheDockerdaemonatunix:///var/run/docker.sock.Isthedockerdaemonrunning? 使用一下命令解决:systemctldaemon-reloadsudoservicedoc......
  • var a = parseInt([0,0,1,0,0].join('')+1) a的值为
    vara=parseInt([0,0,1,0,0].join('')+1)a的值为A2B101C1001DNaN正确答案:C官方解析:"00100"+1="001001"再转换为整数为1001vara=parseInt([0,0,1,0,0].join('')+1)//join()方法将数组转为字符串,并用指定的分隔符进行分割[0,0,1,0,0].join(""......
  • Left Join,Right Join,Inner Join与where连接的区别
    概述连表是SQL常用的操作,但是连表不一样,得到的结果也不一样(在数据量大的时候尤为明显),这里就是对关联表中一些筛选用的关键字的具体区别做了一个详细的梳理。首先准备两张表,分别是tb_student和tb_class表 tb_class表:tb_student表:一、内连接1、隐式内连接:把连接条件放......
  • Java多线程面试题
    目录0、请你说说线程和进程的区别1、请你说说多线程2、说说CAS的ABA问题3、说说你对AQS(抽象队列同步器)的理解4、Java哪些地方使用了CAS5、说说怎么保证线程安全5、说说你了解的线程同步方式6、说说synchronized的用法及原理7、synchronized和Lock有什么区别8、说说Java......
  • 从理解和实战安排多线程学习-知识点整理
    确认目标一个是对知识点的理解,另外一个是对知识点的运用.相辅相成.同时带着Arthus去观察代码的情况.压测出代码的性能.先阅读书籍,理解知识点,这部分速度要快.然后针对知识点做一些练习,这部分速度略慢,不懂的需要查书.提高难度,挑战一些有创意的编程,去综合实现和......