【python】多线程编程中join函数的用法

简介:
在学习python 多线程编程的时候,一定会使用一个函数join,本章内容通过例子讲述join 在多线程编程中有哪些作用。
本文使用两段代码演示其功能
代码一 
import threading, time
def now() :
    return str( time.strftime( '%Y-%m-%d %H:%M:%S' , time.localtime() ) )
def func1():
    print 'start func1: ' + now() + "\n"
    time.sleep(3)
    print 'stop func1: ' + now() + "\n"
def func2():
    print 'start func2: ' + now() + "\n"
    time.sleep(5)
    print 'stop func2: ', now() + "\n"
thtsk = []
thread1 = threading.Thread(target = func1)
thread1.start()
thtsk.append(thread1)
thread2 = threading.Thread(target = func2)
thread2.start()
thtsk.append(thread2)
print 'start join: ' + now() + "\n"
for thd in thtsk:
    thd.join()
print 'end join: ' + now() + "\n"
该样例中使用了两个线程thread1,thread2,分别执行func1,func2,
其中
func1 的动作是打印开始 时间 ,sleep 3s,打印结束时间
func2 的动作是打印开始 时间 ,sleep 5s,打印结束时间。
后面使用start() 方法同步开始执行两个线程,然后开始循环调用两个线程的join()方法,join不加参数的时候结果如下:

解释:
     func1 在3s 之后结束,fun2 在5s之后结束,并且最后输出 【end join】
代码二
import threading, time
def now() :
    return str( time.strftime( '%Y-%m-%d %H:%M:%S' , time.localtime() ) )
def func1():
    print 'start func1: ' + now() + "\n"
    time.sleep(3)
    print 'stop func1: ' + now() + "\n"
def func2():
    print 'start func2: ' + now() + "\n"
    time.sleep(8)
    print 'stop func2: ', now() + "\n"
thtsk = []
thread1 = threading.Thread(target = func1)
thread1.start()
thtsk.append(thread1)
thread2 = threading.Thread(target = func2)
thread2.start()
thtsk.append(thread2)
print 'start join: ' + now() + "\n"
for thd in thtsk:
    thd.join(2)
print 'end join: ' + now() + "\n"
在join()函数添加参数 2 ,表示等待两秒,结果如下

解释:
     两个线程开始并发执行,先执行func1的join(2),等func1执行2s后,执行func2的join(2),等线程2执行2s后,开始执行主进程,打印「end join」,1s之后fun2执行结束。
这里join(2)标示2s之后不管当前线程是否执行完成,都会处理下一个线程。

总结一下:
1 join方法的作用是阻塞主进程无法执行join以后的语句,专注执行多线程,必须等待多线程执行完毕之后才能执行主线程的语句。
2 多线程多join的情况下,依次执行各线程的join方法,前一个结束之后,才能执行后一个。
3 无参数,则等待到该线程结束,才开始执行下一个线程的join。
4 设置参数后,则等待该线程N秒之后不管该线程是否结束,就开始执行后面的主进程。
相关文章
|
6天前
|
Python
【python从入门到精通】-- 第五战:函数大总结
【python从入门到精通】-- 第五战:函数大总结
28 0
|
3天前
|
Python
Python之函数详解
【10月更文挑战第12天】
Python之函数详解
|
4天前
|
存储 数据安全/隐私保护 索引
|
5天前
|
索引 Python
Python中的其他内置函数有哪些
【10月更文挑战第12天】Python中的其他内置函数有哪些
7 1
|
6天前
|
Java Python
python知识点100篇系列(16)-python中如何获取线程的返回值
【10月更文挑战第3天】本文介绍了两种在Python中实现多线程并获取返回值的方法。第一种是通过自定义线程类继承`Thread`类,重写`run`和`join`方法来实现;第二种则是利用`concurrent.futures`库,通过`ThreadPoolExecutor`管理线程池,简化了线程管理和结果获取的过程,推荐使用。示例代码展示了这两种方法的具体实现方式。
python知识点100篇系列(16)-python中如何获取线程的返回值
|
10天前
|
缓存 测试技术 开发者
深入理解Python装饰器:用法与实现
【10月更文挑战第7天】深入理解Python装饰器:用法与实现
9 1
|
5天前
|
开发者 索引 Python
Python中有哪些内置函数
【10月更文挑战第12天】Python中有哪些内置函数
9 0
|
6天前
|
存储 C++ Python
[oeasy]python037_ print函数参数_sep分隔符_separator
本文介绍了Python中`print`函数的`sep`参数,即分隔符。通过回顾上文内容,解释了类型与`type`的概念,并强调了参数类型的重要性。文章详细探讨了`print`函数如何使用`sep`参数来分隔输出值,默认分隔符为空格(序号32)。还讨论了如何修改分隔符为其他字符,如冒号,并解释了为何反斜杠需要使用双反斜杠表示。最后,文章追溯了`sep`名称的由来,以及相关词汇的历史背景,如盎格鲁-萨克逊人的武器和语言。
12 0
|
9天前
|
网络协议 安全 Java
难懂,误点!将多线程技术应用于Python的异步事件循环
难懂,误点!将多线程技术应用于Python的异步事件循环
31 0
WK
|
10天前
|
Python
Python函数命名
在Python中,函数命名应清晰、简洁且易于理解。遵循PEP 8风格指南,使用小写字母和下划线分隔单词,避免单字母命名和保留字。函数名应描述功能,以动词开头,避免泛化名称,使用有意义的缩写,保持命名风格一致,避免魔法数字。示例包括 `calculate_area_of_circle`、`fetch_data_from_api` 和 `save_file_to_disk`。这些实践有助于创建易读、易维护的代码。
WK
9 0