当前位置: 首页 > 编程笔记 >

python 多线程中join()的作用

强化
2023-03-14
本文向大家介绍python 多线程中join()的作用,包括了python 多线程中join()的作用的使用技巧和注意事项,需要的朋友参考一下

一 前言

温习python 多进程语法的时候,对 join的理解不是很透彻,本文通过代码实践来加深对 join()的认识。

multiprocessing 是python提供的跨平台版本的多进程模块。multiprocessing可以充分利用多核,提升程序运行效率。multiprocessing支持子进程,通信和共享数据,执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。不过今天重点了解 join。后续文章会逐步学习介绍其他组件或者功能。

二 动手实践

join()方法可以在当前位置阻塞主进程,带执行join()的进程结束后再继续执行主进程的代码逻辑。

# encoding: utf-8
"""
author: yangyi@youzan.com
time: 2019/7/30 11:20 AM
func:
"""

from multiprocessing import Process
import os
import time

def now():
  return str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))


def func_1(name):
  print(now() + ' Run child process %s (%s)...' % (name, os.getpid()))
  time.sleep(4)
  print(now() + ' Stop child process %s (%s)...\n' % (name, os.getpid()))


def func_2(name):
  print(now() + ' Run child process %s (%s)...' % (name, os.getpid()))
  time.sleep(8)
  print(now() + ' hello world!')
  print(now() + ' Stop child process %s (%s)...\n' % (name, os.getpid()))


if __name__ == '__main__':
  print ('Parent process %s.' % os.getpid())
  p1 = Process(target=func_1, args=('func_1',))
  p2 = Process(target=func_2, args=('func_2',))
  print now() + ' Process start.'
  p1.start()
  p2.start()
  p1.join()
  p2.join()
  print now() + ' Process end .'

输出结果

结果显示

进程的 Process end .是在func1 和func2 结束之后才打印出来的。

2.2 去掉 join() 函数

if __name__ == '__main__':
  print ('Parent process %s.' % os.getpid())
  p1 = Process(target=func_1, args=('func_1',))
  p2 = Process(target=func_2, args=('func_2',))
  print now() + ' Process start.'
  p1.start()
  p2.start()
  print now() + ' Process end .'

结果如下:

2.3 去掉func_2 的 join()

if __name__ == '__main__':
  print ('Parent process %s.' % os.getpid())
  p1 = Process(target=func_1, args=('func_1',))
  p2 = Process(target=func_2, args=('func_2',))
  print now() + ' Process start.'
  p1.start()
  p2.start()
  p1.join() ### 在p1 执行完之后 。不等待p2 执行,主进程结束。
  print now() + ' Process end .'

结果如下:

结果显示主线程 "Process end"在func_1 执行结束之后输出而没有等待func_2 执行完毕。

2.4 小结

利用多线程时,一般都先让子线程调用start() ,然后再去调用join(),让主进程等待子进程结束才继续走后续的逻辑。

思考题

能不能每个子进程调用start() 之后,然后直接调用join() 类似:

p1.start()p1.join()p2.start()p2.join()

以上就是python 多线程中join()的作用的详细内容,更多关于python 多线程join()的资料请关注小牛知识库其它相关文章!

 类似资料:
  • 本文向大家介绍python多线程编程中的join函数使用心得,包括了python多线程编程中的join函数使用心得的使用技巧和注意事项,需要的朋友参考一下 今天去辛集买箱包,下午挺晚才回来,又是恶心又是头痛。恶心是因为早上吃坏东西+晕车+回来时看到车祸现场,头痛大概是烈日和空调混合刺激而成。没有时间没有精神没有力气学习了,这篇博客就说说python中一个小小函数。 由于坑爹的学校坑爷的专业,多线程

  • 问题内容: 我正在研究python线程并遇到了。 作者告诉我,如果线程处于守护程序模式,那么我需要使用它,以便线程可以在主线程终止之前完成自身。 但我一直在使用也没见他即使不 示例代码是这个 我不知道这是什么用途,因为它不是守护程序,即使删除它也看不到任何变化 问题答案: 展示这种机制的技术有些笨拙:大概是由主线程调用的。也可以由另一个线程调用它,但是会不必要地使该图复杂化。 -调用应该放在主线程

  • 无法理解为什么Fork-Join在多核利用方面更好。 举例说明(仅为理论): 我有一个Web服务endpoint数组:[E1、E2、E3、E4] 假设每个endpoint都返回一个数字。 然后我必须总结总数并返回结果。 记住这个简单的故事。 我有两个选择: ExecutorService修复了4个线程池,并并行跨越这4个调用 假设我有4个核。 有了Executor service,就可以创建4个J

  • 问题内容: 我有一个python应用程序,它可以捕获数据集合,并针对该集合中的每个数据执行任务。由于涉及到延迟,因此该任务需要一些时间才能完成。由于这种延迟,我不希望每个数据都随后执行任务,而是希望它们全部并行发生。我应该使用多进程吗?或执行此操作的线程? 我尝试使用线程,但遇到了一些麻烦,通常某些任务实际上不会执行。 问题答案: 如果您确实受到计算的限制,那么使用多处理模块可能是最轻巧的解决方案

  • 本文向大家介绍详解Python中的多线程编程,包括了详解Python中的多线程编程的使用技巧和注意事项,需要的朋友参考一下 一、简介        多线程编程技术可以实现代码并行性,优化处理能力,同时功能的更小划分可以使代码的可重用性更好。Python中threading和Queue模块可以用来实现多线程编程。 二、详解 1、线程和进程        进程(有时被称为重量级进程)是程序的一次执行。

  • 本文向大家介绍python中的多线程实例教程,包括了python中的多线程实例教程的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式较为详细的讲述了Python中多线程的用法,在Python程序设计中有着比较广泛的应用。分享给大家供大家参考之用。具体分析如下: python中关于多线程的操作可以使用thread和threading模块来实现,其中thread模块在Py3中已经改名为_thre

  • 本文向大家介绍理解python多线程(python多线程简明教程),包括了理解python多线程(python多线程简明教程)的使用技巧和注意事项,需要的朋友参考一下 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂。所以,这里力图用简单的例子,让你对多线程有个初步的认识。 单线程   在好些年前的MS-DOS时代,操作系统处理问题都是单任务的,我想做听音乐和看电影两

  • 问题内容: 我正在使用这些功能在画布上绘制小圆圈: 这是绘制圆圈的功能: 这个创建画布和圆圈: 我称这些行来运行项目: 什么是执行正确的方法,并在不同的线程? 我已经尝试了以下方法,但无法使其正常工作。: 有人可以告诉我如何运行这些线程吗? 问题答案: 当需要此功能时,您要做的是通过将事件置于线程共享的队列中来安排要执行的事件。这样,在给定线程中,您可以通过排队指定要运行“ create(50,…