(python) 多线程和多进程中的join方法的用处

python爬虫(中)--多进程和多线程 前面我们见到了基本爬虫的请求、提取和保存,这是一个基本爬虫应该有的结构,那么这时候的这个爬虫有了能爬能存的能力,但是这种能力是很弱的,弱主要体现在三点:①爬虫本身健壮性并不高,有很多情况不一定考虑到;②爬虫爬的很慢,效率很低;③防反爬能力不强,容易被Ban掉 我们在这篇博文就会就上面第二点讲讲怎么通过运用多线程和多进程来提高爬虫的工作效率. 阅读详情

python中为了加快任务的运行速度,会采用多线程或者多线程的方式。不论是在多进程还是多线程中都会用到join()方法,开始不知道这个方法是干什么的,因此在网上查看很多文章后总结了一下join()方法的用处。

此处不解释进程和线程的区别,但首先要知道进程是线程的容器,即一个进程可以包含很多线程。此处使用多线程作为例子进行解释。


默认情况:

每一个进程启动后都默认会产生一个主线程,在默认情况下(即setDaemon(False),默认即为False,不用设置),使用threading模块产生新的线程后,子线程和主线程的运行是独立的,即主线程停止后子线程也会继续运行直到子线程任务结束,子线程停止当然更不会影响主线程的运行。(此处使用停止来描述主进程是因为即使主线程执行完任务,但主线程还是存在于整个进程列表中,个人这样理解哈,便于后续的理解)

例:

import threading
def test():
	x = 0
	for i in range(5):
		x = i + x
		print(x)
	print(str(threading.enumerate())) # 打印出当前进程中的所有线程

if __name__ == '__main__':
	thread = threading.Thread(target=test)
	thread.start()
	print('nihao')

结果如下:

在这里插入图片描述

从结果中可以看出主线程中要打印的‘nihao’在子线程运行第一次循环即x=0+0后就已经打印出来了,此后主线程就进入停止状态(即stop状态),之后在子线程循环结束后,打印出当前所有线程。可以发现有主线程和子线程两个进程,但主线程已经停止了,即说明了默认情况下主线程停止不影响子进程的运行。(这里我理解是主线程虽然已经停止,但其需要等待子线程全部停止即结束,这样才能代表整个脚本的任务完成,这时候一个完整的进程才算结束。)

设置守护进程的情况:

若将setDaemon设置为True时则与默认情况不一样,setDaemon的意思是设置某线程为守护线程。守护线程很多人解释说是当主进程结束时,那么守护线程就会随主线程一起结束,但实际情况不是这样。

只有一个子进程(守护线程)的情况:

import threading
def test():
	x = 0
	for i in range(5):
		x = i + x
		print(x)
	print(str(threading.enumerate()))  # 打印出当前进程中的所有线程
if __name__ == '__main__':
	thread = threading.Thread(target=test)
	thread.setDaemon(True)
	thread.start()
	print('nihao')

这里只在上面代码中加了setDaemon(True),结果只出现了 0nihao,执行不同次可能结果不同哈,因为线程有时候快一点,有时候慢一点。这确实印证了,主进程结束了,守护进程就结束了,但是在多增加一个非守护进程之后结果就不是这样了,如下:

import threading
def test1():
	while True:
		print('nihao')
def test2():
	while True:
		print(str(threading.enumerate()))
if __name__ == '__main__':
	thread1 = threading.Thread(target=test1)
	thread2 = threading.Thread(target=test2)
	thread1.setDaemon(True)
	thread1.start()
	thread2.start()

这个脚本会无限次地运行,此处我截取一部分结果如下:

在这里插入图片描述
可以看出主线程已经停止了,但是守护线程test1还是在工作,还是在打印 nihao这个字符,也就表明主线程停止不会导致守护线程结束,而是不再理会守护线程的完成状态,即在有守护线程的情况下,只要其它的非守护线程和主线程都结束了,整个任务就结束了,不用考虑守护线程是否完成。

使用join的情况:

因此为了避免主线程提前结束导致子线程未完成的情况,join横空出世,使用join方法表示主线程的任务在碰到子线程join方法时会阻塞,此时主线程任务不再继续,而是等待所有子线程任务全部结束后,主线程才会继续运行直到停止。

上面的第二个例子,加入join()后:

import threading
def test():
	x = 0
	for i in range(5):
		x = i + x
		print(x)
	print(str(threading.enumerate()))  # 打印出当前进程中的所有线程
if __name__ == '__main__':
	thread = threading.Thread(target=test)
	thread.setDaemon(True)
	thread.start()
	thread.join()
	print('nihao')

结果如下:

在这里插入图片描述
可以看到这样结果就很好看了,也是很有条理的。总之,这就是join()的作用啦。

join()方法还有一个参数为timeout,即时间限制,对于守护线程的效果是经过timeout的时间后此守护线程就结束。而对于非守护线程,那么timeout时间后子线程还是可以继续执行,但此时主线程会开始执行,主线程任务执行后会进入停止即stop状态。

例:

import threading
def test():
	while True:
		print('x')
		print(str(threading.enumerate()))
if __name__ == '__main__':
	thread = threading.Thread(target=test)
	thread.start()
	thread.join(0.1)
	print(str(threading.enumerate()))

结果如下(一部分):

在这里插入图片描述

叮!

参考:Python多线程与多线程中join()的用法
参考:Python:线程为什么搞个setDaemon

三、分区配置 rk3566/rk3568 修改分区 阅读详情

相关推荐

手把手教你用示波器搞定PCIe 5.0 REFCLK时钟信号测量(附完整参数解读)

本文详细介绍了如何使用示波器进行PCIe 5.0 REFCLK时钟信号测量,包括示波器与探头的选择、关键参数的测量方法及解读,以及实战中的常见问题与解决方案。通过手把手教学和完整参数解读,帮助硬件工程师高效完成时钟信号测量,确保系统稳定性。

weixin_28704565的博客 359

python线程join方法

join方法的作用是同步线程。

爱在深秋 6444

VS2022错误列表高效处理:从复制到Excel表格的完整指南

本文详细介绍了在Visual Studio 2022中高效处理错误列表的实用技巧,重点讲解了如何将错误信息一键复制并粘贴到Excel表格中。通过基础操作、自定义视图、筛选功能及常见问题解决方案,帮助开发者将杂乱的编译错误整理成清晰、可排序、可筛选的数据表,极大提升了团队协作、错误分析和项目管理的效率。

weixin_28837817的博客 358

多线程中的Join

线程中join(强制执行):当前线程执行完毕之后,才会执行后面程序,其他线程阻塞; 实例: public class ThreadJoin implements Runnable{ @Override public void run() { for (int i = 1; i < 1000; i++) { System.out.println("Join..."+i+"运行中"); } } public stat

柯基的博客 3203

直流电动机的建模仿真(1)他励,串励和并励电动机建模仿真

本文根据不同励磁方式的直流电动机的接线原理图,建立了相应的数学模型,然后根据与数学模型对应的等效电路以及模拟机械运动方程的等效电路,用Matlab/simulink中的SpecializedPower system库中的电路元件,建立了他励,并励和串励直流电动机的全等效电路仿真模型,经过与Matlab自带的直流电动机仿真模型比较以及仿真实例验证,所建立的仿真模型时完全正确的。

weixin_45670943的博客 7515

S32K144驱动TPS929120避坑实录:从原理图设计到PWM调光漏电流的完整解决流程

本文详细解析了S32K144驱动TPS929120在车规LED驱动中的常见问题与解决方案,重点解决了PWM调光漏电流的行业难题。从原理图设计、FlexWire通信到软件调试,提供了一套完整的工程化避坑指南,特别针对车规MCU应用中的温度漂移、地址冲突等痛点给出了实用建议。

weixin_30872157的博客 561

Python多线程(四)——join属性

Python多线程之join()属性

重邮皮皮尛的博客 1782

AI基础入门(大模型基础篇)——技术视角:你应该知道的LLM基础知识

本文从技术视角解析了大模型的工作原理,主要介绍了三个核心概念:Token、温度和Embedding。首先,大模型通过逐个添加Token来生成文本,Token数量直接影响上下文窗口大小和计费标准。其次,通过引入温度参数控制随机性,温度越高输出越多样化。最后,解释了字符串如何通过One-Hot编码和神经网络压缩转化为向量形式的Embedding,这是AI处理各类输入的基础。这些概念对理解大模型应用开发至关重要,Token决定处理能力,温度影响输出风格,Embedding则是信息转换的关键步骤。

小志的博客 1503

python 多线程 join用法 简介

目录 概念说明 Python多线程的默认情况 设置守护线程 join的作用 python多线程与多进程中join()方法的效果是相同的。 下面仅以多线程为例 概念说明 知识点一: 当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束,例子见下面一。 知识点二:

whatday的专栏 3994

STM32 HAL PWM (占空比) -电机软启动不到位解决

为了避免电机启动电压大造成设备损坏,或者供电不足导致重启,通常在对启动都需要一个PWM进行软启动,下面对PWM电机软启动详细介绍。

weixin_44597885的博客 866

YOLO11全网首发优化:卷积魔改创新 | AAAI 2025 | 一种新颖的风车形卷积(PConv)符合微弱小目标的像素高斯空间分布,增强特征提取,显著增加接受野

我们提出了一种新颖的风车形卷积(PConv)作为骨干网络下层标准卷积的替代品。PConv能更好地符合微弱小目标的像素高斯空间分布,增强特征提取,显著增加接受野,且只引入最小的参数增加。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1972

python线程join()方法使用

所以运行流程为:main线程启动-->thread1启动--->thread2启动--->thread1与2均阻塞main线程运行-->thread1与2并行运行-->thread1与2运行完毕--->main线程运行结束。时,target=get_target_html(), target=get_target_url()会自动实例化并。可以看出主线程在两个子线程运行完成之前就结束了,两个子线程继续执行直至完成。笔者在第一次写程序时,在调用两个子线程方法时。,类不带括号---赋值,带括号---实例化。

nairuozi的博客 3955

CUDA编程 - Nsight system & Nsight compute 的安装和使用 - 学习记录

在 cuda 编程中,经常会用到 Nsight system 和 Nsight compute 进行性能分析等,下面做个学习总结。本篇包括安装和常用分析思路总结,具体实践操作总结会放在下一篇博客。

点云算法工程师 1万+

Python 多线程中的join用法

这里写自定义目录标题第一种:Python多线程的默认情况(设置线程setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束第二种:开启线程的setDaemon(True),设置子线程为守护线程,实现主程序结束,子程序立马全部结束功能第三种:加入join方法,当不给程序设置守护进程时,主程序将一直等待子程序全部运行完成才结束第四种:通用不设置守护进程,但是给join设置timeout数值,判断等待多后子线程还没有完成,则主线程不再等待第五种:

玖艺东哥 9736

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

python的multiprocessing多进程和线程问题以及join()等

可能需要参考:并行、串行、并发 参考:线程创建知识: 总结:python中,一个进程创建后会自动建立一个主线程,在建立其他子线程后,会出现主线程结束后,一、(设置set.Daemon(True))子线程结束 ;二、(默认set.Daemon(false))时间结束(子线程仍执行的情况)三、使用join()中的参数有一个timeout,可以设置结束时间,也可以默认子线程执行结束完成。这时主线程需要等待到对应条件满足后才结束。 multiprocessing的模块使用显示问题 一个简单进程的建立使用 impor

weixin_43794311的博客 6497

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

python多线程和多进程中的join()用法?

python多线程和多进程中的join()用法? python多线程的模块是threading ,多进程的模块是 multiprocessing 需要理解的知识点一 当一个进程启动后, 会默认产生一个主线程, 因为线程是执行程序的最小单元,当设置多线程时, 主线程会自动创建多个子线程, 在python3中, 默认情况下 setDaemon为false, 主线程执行完自己的任务时,就退出了, 子线...

造梦师Fred的博客 1484

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Python多线程和多进程的Join和daemon(守护)的用法

转载于https://www.cnblogs.com/cnkai/p/7504980.html Python多线程与多进程中join()方法和daemon的效果是相同的。 基本知识 下面仅以多线程为例: 首先需要明确几个概念: 知识点一:当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是...

Mr_health的博客 3806

python多线程与多进程中join()作用详解

Python多线程与多进程中join()方法的效果是相同的。下面以多线程为例:join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程再终止没有join的情况下:import threading import time def run(): time.sleep(2) print('当前线程的名字是: ', threading...

qq_41020281的博客 4904

【Python】Python中的多线程与多进程

在python中有两个库多进程和多线程相关,一个是threading关于多线程,另外一个是processing是多进程。

zwan0518的专栏 7675

Python中的多线程与多进程

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。在上述的多线程和多进程示例中,在多线程或多进程的环境中,

Trb201012的博客 458

Python入门——多线程、多进程概括&API参数、Thread.join()、什么是线程死锁、如何避免?

详细讲解了什么是多线程、多进程及其API参数、Thread.join()、什么是线程死锁、如何避免?

m0_74893204的博客 1542

python之多线程和多进程

参考链接: 多线程 多进程 概要 由于python中的GIL(全局解释器锁)的存在,也就是多线程的时候,同一时间只能有一个线程在CPU上运行,而且是单个CPU上运行,不管你的CPU有多少核数。如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。 多进程 Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Process对象来创建一个进程对象。这个进程对象的方法和线程对象的方

AndyJ的学习之旅 513

Python - 多线程,多进程中的join和Event及没有使用join和event区别

在Python的多线程和多进程编程中,`join()` 和 `Event` 都是用来控制线程或进程之间的同步关系的工具,它们的作用类似,但还是有一些区别。

Mr_WoLong 1177

Python多线程之join方法与守护线程

大神请绕道 join在多线程中的作用 当先看一段代码,并判断一下这个cost的值为多少 import threading, time def a(): print('in a') time.sleep(2) print('out a') def b(): print('in b') time.sleep(3) print('out b') if __...

u013887652的博客 634

深度学习多进程GPU部署(一)- python多进程多线程

个处理,第一个数据处理完预测,下一个数据进来(队列的形式),这样的部署,在业务上预测延迟很大的。再了解如何用深度学习部署多进程之前,先学习一下,python中多进程多线程是如何实现以及原理的。

weixin_42010722的博客 1万+

Python的多进程、多线程及协程

python 多线程、多进程、协程

Mark_Australia的博客 2726
上一篇: 入门R语言(2):变量、运算符、决策、循环、函数、字符串的基础方法
下一篇: 同步异步、串行并行并发、阻塞非阻塞、进程线程协程概念的简单理解及区分
你大佬来啦
博客等级 码龄7年 322粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值