【问题标题】:will non-daemon python threads exit after they're done with their task?非守护程序python线程在完成任务后会退出吗?
【发布时间】:2013-07-22 16:50:07
【问题描述】:

上下文:我有一个简单的 python 脚本,它每隔几秒将一堆文件写入 s3 (~70-100)。因为它受 I/O 限制,所以我想线程化写入过程,以便脚本执行得更好。我正在使用threading 来构建我的线程。

问题:因为我的线程是 a) 非守护进程 b) 如果我遍历我的线程列表并调用 .join(),它们只有 1 个任务要执行(写入文件)他们会完成任务并优雅地退出吗?我什至需要在这里打电话给join() 还是他们会在完成后退出?我相信 join() 是去这里的方式,但由于我对 python 很陌生,我不知道我不知道什么......

这里有一些简化的代码供参考:

buildOutput() #calls the section below 
for thread in threads:
   thread.join()
time.sleep(60)

调用:

  for item in out[fileRoot]: 
        #write individiual files
        key = findKey(item, FILE_KEY)
        full_key = FILE_PATH + str(key) + FILE_TYPE
        t = FileWriter(item, full_key)
        t.start()
        threads.append(t) #global threads list for the script

其中 FileWriter 是进行写入的类。

【问题讨论】:

    标签: python multithreading io


    【解决方案1】:

    Join 确保主线程将等待,直到加入的线程完成其任务。给here有一个很好的ascii艺术。

    因此,您最好在子线程执行 I/O 时使用 join 来防止任何意外行为。

    【讨论】:

    • 对,但是当线程完成任务时会发生什么?有没有什么机制可以让我确定没有任何东西像僵尸进程或垃圾收集问题一样四处飘荡?类似的东西?
    • 像任何其他方法一样处理,从堆栈中删除。由于我们谈论的是线程,因此不会有任何类似于僵尸进程的东西,因为正如您所说,它们完成了任务。然而,如果没有加入,如果主线程退出而另一个还没有完成,他们的堆栈将保留(不好)。