python线程join的正解

本文探讨了Python中线程的行为特点,包括默认参数下主线程与子线程的关系、daemon属性的作用及join方法的功能。通过具体代码示例展示了不同设置下线程的执行情况。

几个事实

1 python 默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样

2 如果创建线程,并且设置了daemon为true,即thread.setDaemon(True), 则主线程执行完毕后自动退出,不会等待子线程的执行结果。而且随着主线程退出,子线程也消亡。

3 join方法的作用是阻塞,等待子线程结束,join方法有一个参数是timeout,即如果主线程等待timeout,子线程还没有结束,则主线程强制结束子线程。

4 如果线程daemon属性为False, 则join里的timeout参数无效。主线程会一直等待子线程结束。

5 如果线程daemon属性为True, 则join里的timeout参数是有效的, 主线程会等待timeout时间后,结束子线程。此处有一个坑,即如果同时有N个子线程join(timeout),那么实际上主线程会等待的超时时间最长为 N * timeout, 因为每个子线程的超时开始时刻是上一个子线程超时结束的时刻。


测试代码和运行结果:

import threading, time  
def doThreadTest():  
    print 'start thread time:', time.strftime('%H:%M:%S')  
    time.sleep(10)  
    print 'stop thread time:', time.strftime('%H:%M:%S')  

threads = []
for i in range(3):
    thread1 = threading.Thread(target = doThreadTest)  
    thread1.setDaemon(True)

    threads.append(thread1)
 
for t in threads:
    t.start() 


for t in threads:
    t.join(1)
print 'stop main thread' 




如果把    thread1.setDaemon(True) 注释掉, 运行结果为



Python 的 `threading` 模块中,`join` 方法用于控制线程的执行顺序。当一个线程调用了 `join` 方法后,调用该方法的线程(通常是主线程)会等待直到被调用 `join` 的线程执行完成。 ### 作用 - **同步线程**:`join` 方法确保主线程等待子线程完成后才继续执行。这在需要确保某些代码在子线程执行完毕后才运行时非常有用。 - **防止竞态条件**:通过确保线程执行顺序,可以避免竞态条件(Race Condition),即多个线程同时访问和修改共享资源时可能导致的问题。 ### 使用方式 以下是一个简单的示例,演示如何使用 `join` 方法: ```python import threading import time def worker(): print("Worker thread starting") time.sleep(2) print("Worker thread finished") # 创建线程 thread = threading.Thread(target=worker) # 启动线程 thread.start() # 等待线程完成 thread.join() print("Main thread continues after worker thread") ``` ### 输出结果: ``` Worker thread starting Worker thread finished Main thread continues after worker thread ``` 在这个例子中,主线程调用了 `thread.join()`,因此它会等待 `worker` 线程执行完毕后才继续打印 `"Main thread continues after worker thread"` [^1]。 ### 可选参数 `join` 方法还可以接受一个可选的浮点数参数,表示等待线程完成的最大时间(以秒为单位)。如果在指定时间内线程未完成,主线程将继续执行。例如: ```python thread.join(1.0) # 最多等待1秒 ``` 如果线程在指定时间内完成,`join` 会立即返回;否则,它会在超时后返回。 ### 注意事项 - 如果不调用 `join`,主线程可能在子线程完成之前结束,导致程序提前退出。 - 调用 `join` 时,确保线程已经启动,否则会引发异常。 ###
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值