Python多线程与多线程中join()的用法

别有洞天
• 阅读 906

概述

Python多线程与多进程中join()方法的效果是相同的。

下面仅以多线程为例,首先需要明确几个概念:

A、当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束,例子见下面一。

B、当我们使用setDaemon(True)方法,设置子线程为守护线程时,主线程一旦执行结束,则全部线程全部被终止执行,可能出现的情况就是,子线程的任务还没有完全执行结束,就被迫停止,例子见下面二。

C、此时join的作用就凸显出来了,join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程在终止,例子见下面三。

D、join有一个timeout参数:

1、当设置守护线程时,含义是主线程对于子线程等待timeout的时间将会杀死该子线程,最后退出程序。所以说,如果有10个子线程,全部的等待时间就是每个timeout的累加和。简单的来说,就是给每个子线程一个timeout的时间,让他去执行,时间一到,不管任务有没有完成,直接杀死。

2、没有设置守护线程时,主线程将会等待timeout的累加和这样的一段时间,时间一到,主线程结束,但是并没有杀死子线程,子线程依然可以继续执行,直到子线程全部结束,程序退出。

Python多线程的默认情况

#!/usr/bin/python
#! -*- coding:utf-8 -*-
import threading
import time
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def run():
    time.sleep(2)
    print('当前线程的名字是: ' + threading.current_thread().name)
    time.sleep(2)
if __name__ == '__main__':
    start_time = time.time()
    print('这是主线程:' +  threading.current_thread().name)
    thread_list = []
    for i in range(5):
        t = threading.Thread(target=run)
        thread_list.append(t)
    for t in thread_list:
        t.start()
    print('主线程结束!' + threading.current_thread().name)
    print('一共用时:'+ str(time.time()-start_time))

运行结果如下:

[root@OPS wechat]# python t.py 
这是主线程:MainThread
主线程结束!MainThread
一共用时:0.000776052474976
当前线程的名字是: Thread-1
当前线程的名字是: Thread-2
当前线程的名字是: Thread-3
当前线程的名字是: Thread-4
当前线程的名字是: Thread-5
[root@OPS wechat]#

关键点:

1、我们的计时是对主线程计时,主线程结束,计时随之结束,打印出主线程的用时。
2、主线程的任务完成之后,主线程随之结束,子线程继续执行自己的任务,直到全部的子线程的任务全部结束,程序结束。

设置守护线程

#!/usr/bin/python
#! -*- coding:utf-8 -*-
import threading
import time
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def run():
    time.sleep(2)
    print('当前线程的名字是: '+ threading.current_thread().name)
    time.sleep(2)
if __name__ == '__main__':
    start_time = time.time()
    print('这是主线程:'+ threading.current_thread().name)
    thread_list = []
    for i in range(5):
        t = threading.Thread(target=run)
        thread_list.append(t)
    for t in thread_list:
        t.setDaemon(True)
        t.start()
    print('主线程结束了!' + threading.current_thread().name)
    print('一共用时:'+ str(time.time()-start_time))

其执行结果如下,注意请确保setDaemon()在start()之前。

[root@OPS wechat]# python t.py 
这是主线程:MainThread
主线程结束了!MainThread
一共用时:0.000770092010498

关键点:非常明显的看到,主线程结束以后,子线程还没有来得及执行,整个程序就退出了。

join的作用

#!/usr/bin/python
#! -*- coding:utf-8 -*-
import threading
import time
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def run():
    time.sleep(2)
    print('当前线程的名字是: '+ threading.current_thread().name)
    time.sleep(2)
if __name__ == '__main__':
    start_time = time.time()
    print('这是主线程:'+ threading.current_thread().name)
    thread_list = []
    for i in range(5):
        t = threading.Thread(target=run)
        thread_list.append(t)
    for t in thread_list:
        t.setDaemon(True)
        t.start()
    for t in thread_list:
        t.join()
    print('主线程结束了!' + threading.current_thread().name)
    print('一共用时:'+ str(time.time()-start_time))

其执行结果如下:

[root@OPS wechat]# python t.py 
这是主线程:MainThread
当前线程的名字是: Thread-1
当前线程的名字是: Thread-2
当前线程的名字是: Thread-3
当前线程的名字是: Thread-4
当前线程的名字是: Thread-5
主线程结束了!MainThread
一共用时:4.00501298904
文源网络,仅供学习之用,侵删。

在学习Python的道路上肯定会遇见困难,别慌,我这里有一套学习资料,包含40+本电子书,800+个教学视频,涉及Python基础、爬虫、框架、数据分析、机器学习等,不怕你学不会!
https://shimo.im/docs/JWCghr8... 《Python学习资料》

关注公众号【Python圈子】,优质文章每日送达。

Python多线程与多线程中join()的用法

点赞
收藏
评论区
推荐文章
DevOpSec DevOpSec
4年前
python多线程原理和详解(一)
python多线程原理和详解线程概念1.线程是什么?线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
Wesley13 Wesley13
3年前
java多线程的3种实现方式
多线程相关的问题1.什么是进程?​正在执行的程序2.什么是线程?​进程的子单位,一个能够完成独立功能的执行路径3.为什么需要开启多线程?当执行某些耗时操作的任务的时候需要开启多线程,防止线程阻塞能够让两个任务看起来像是在同时执行
Bill78 Bill78
4年前
python多线程详解
python中的多线程是一个非常重要的知识点,今天为大家对多线程进行详细的说明,代码中的注释有多线程的知识点还有测试用的实例。码字不易,阅读或复制完了,点个赞!importthreadingfromthreadingimportLock,Threadimporttime,os'''
Stella981 Stella981
3年前
Python 多进程程批量爬取小
使用python多进程跑同样的代码。python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiproc
Stella981 Stella981
3年前
Python实现多进程
Python可以实现多线程,但是因为GlobalInterpreterLock(GIL),Python的多线程只能使用一个CPU内核,即一个时间只有一个线程在运行,多线程只是不同线程之间的切换,对多核CPU来说,就是巨大的浪费。如4核CPU,实际上只利用了一个核,CPU利用率只有25%。要充分利用多核CPU,可以实现Python的多进程。首先,im
Wesley13 Wesley13
3年前
Java高级教程02
\TOC\1.Java线程1.1.多线程和多进程多进程:操作系统能够同时进行多个任务:每个app(word,播放器,浏览器)可以同时运行多线程:同一应用程序中哟多个顺序流同时执行线程是进程中的一部分1.2.线程的执行过程:!(
Stella981 Stella981
3年前
Python并发(二)
并发是指一次处理多件事,而并行是指一次做多件事。二者不同,但互相有联系。打个比方:像Python的多线程,就是并发,因为Python的解释器GIL是线程不安全的,一次只允许执行一个线程的Python字节码,我们在使用多线程时,看上去像很多个任务同时进行,但实际上但一个线程在执行的时候,其他线程是处于休眠状态的。而在多CPU的服务器上,Java或Go的多线程,
Wesley13 Wesley13
3年前
Java总结:Java多线程
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。Java给多线程编程提供了内置的支持。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。这里定义和线程相关的另一个术语进程:一个进程包括由操作系统分配的内存空间,
Wesley13 Wesley13
3年前
Java oop 第13章_多线程
第13章\_多线程一、多线程相关的概念:1.程序:由某种编程语言开发可执行某些功能的代码组合,它是静态的概念。2.进程:当程序被执行时的过程可以理解为讲程序从外存调入内存的过程,会为每一个程序至少开辟一个独立的内存空间,程序在内存中的状态称为一个进程。3.线程:一个进程至少会有一个独
Wesley13 Wesley13
3年前
Java面试问题——线程全面详解总结
一、多线程是什么?为什么要用多线程?介绍多线程之前要介绍线程,介绍线程则离不开进程。首先进程 :是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元;线程:就是进程中的一个独立控制单元,线程在控制着进程的执行。一个进程中至少有一个进程。多线程:一个进程中不只有一
Wesley13 Wesley13
3年前
Selenium2 Python 自动化测试实战学习笔记(八)
Python多线程分布式和并行是完全不同的概念,分布式只负责将一个测试脚本可调用不同的远程环境来执行;并行强调“同时”的概念,它可以借助多线程或多进程技术并行来执行脚本技术。10.1单进程的时代        在单线程的时代,当处理器要处理多个任务时,必须要对这些任务排一下执行顺序并按照这个顺序