python多线程编程中的join函数使用心得

作者:junjie 时间:2021-09-28 16:49:30 

今天去辛集买箱包,下午挺晚才回来,又是恶心又是头痛。恶心是因为早上吃坏东西+晕车+回来时看到车祸现场,头痛大概是烈日和空调混合刺激而成。没有时间没有精神没有力气学习了,这篇博客就说说python中一个小小函数。

由于坑爹的学校坑爷的专业,多线程编程老师从来没教过,多线程的概念也是教的稀里糊涂,本人python也是菜鸟级别,所以遇到多线程的编程就傻眼了,别人用的顺手的join函数我却偏偏理解不来。早上在去辛集的路上想这个问题想到恶心,回来后继续写代码测试,终于有些理解了(python官方的英文解释理解不了,网友的解释也不够详细,只能自己钻)。
测试用的代码如下:


# coding: utf-8

# 测试多线程中join的功能

import threading, time 
def doWaiting(): 
    print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n" 
    time.sleep(3) 
    print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"
def doWaiting1(): 
    print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"  
    time.sleep(8) 
    print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n" 
tsk = []   
thread1 = threading.Thread(target = doWaiting) 
thread1.start() 
tsk.append(thread1)
thread2 = threading.Thread(target = doWaiting1) 
thread2.start() 
tsk.append(thread2)
print 'start join: ' + time.strftime('%H:%M:%S') + "\n"  
for tt in tsk:
    tt.join()
print 'end join: ' + time.strftime('%H:%M:%S') + "\n"

这个小程序使用了两个线程thread1和thread2,线程执行的动作分别是doWaiting()和doWaiting1(),函数体就是打印「开始」+休眠3秒+打印「结束」,分别附加上时间用来查看程序执行的过程。后面用start()方法同步开始执行两个线程。然后开始循环调用两个线程的join()方法,在此之前和之后都会用print函数做好开始结束的标记。我们主要观察for tt in tsk: tt.join()。

join()不带参数的情况下,执行如下:

python多线程编程中的join函数使用心得

可以看到,两个线程并行执行,进程1在3s后结束,进程2在8s后结束,然后回到主进程,执行打印「end join」。

下面把参数设置成超时2s,即tt.join(2),执行如下:

python多线程编程中的join函数使用心得

两个线程开始并发执行,然后执行线程1的join(2),等线程1执行2s后就不管它了,执行线程2的join(2),等线程2执行2s后也不管它了(在此过程中线程1执行结束,打印线程1的结束信息),开始执行主进程,打印「end join」。4s之后线程2执行结束。

总结一下:

1.join方法的作用是阻塞主进程(挡住,无法执行join以后的语句),专注执行多线程。

2.多线程多join的情况下,依次执行各线程的join方法,前头一个结束了才能执行后面一个。

3.无参数,则等待到该线程结束,才开始执行下一个线程的join。

4.设置参数后,则等待该线程这么长时间就不管它了(而该线程并没有结束)。不管的意思就是可以执行后面的主进程了。

最后附上参数为2时的程序执行流程表,自己画的orz,这样看起来更好理解。

python多线程编程中的join函数使用心得

标签:python,多线程,join
0
投稿

猜你喜欢

  • MySQL redo死锁问题排查及解决过程分析

    2024-01-17 08:17:02
  • lambda 表达式导致 Arthas 无法 redefine 的问题

    2023-08-25 18:05:05
  • MyBatis-plus+达梦数据库实现自动生成代码的示例

    2024-01-16 03:41:42
  • Pycharm 2to3配置,python2转python3方式

    2021-07-05 21:39:50
  • python飞机大战pygame游戏框架搭建操作详解

    2022-09-24 05:49:51
  • Python实现动态加载模块、类、函数的方法分析

    2022-07-25 22:48:58
  • python ctypes库2_指定参数类型和返回类型详解

    2021-10-17 14:34:50
  • Python3.5实现的罗马数字转换成整数功能示例

    2023-02-18 21:17:32
  • Python assert语句的简单使用示例

    2023-06-12 16:38:58
  • CSS教程:关于网页图片的属性的介绍

    2008-10-31 12:02:00
  • matlab和Excel的数据交互操作(非xlsread和xlswrite)

    2022-06-16 01:00:42
  • python查询MySQL将数据写入Excel

    2023-12-15 13:48:11
  • php session应用实例 登录验证

    2023-11-14 13:49:43
  • python matplotlib自定义colorbar颜色条及内置色条详解

    2023-04-03 16:50:34
  • 浅析Golang中字符串拼接问题

    2024-04-28 09:17:07
  • 不完全HTML在线编辑器收集

    2007-11-08 12:20:00
  • keras topN显示,自编写代码案例

    2021-03-19 03:15:13
  • 用OpenCV进行年龄和性别检测的实现示例

    2021-02-17 18:18:19
  • golang执行命令操作 exec.Command

    2024-04-26 17:31:20
  • Django 中使用流响应处理视频的方法

    2021-01-12 20:55:13
  • asp之家 网络编程 m.aspxhome.com