线程模块上的守护程序属性无法正常工作

时间:2018-09-11 23:57:28

标签: python python-3.x multithreading

没有介绍,我写了以下脚本:

#!/usr/bin/env python3
import threading

def hello():
    print('hello world')

def open_file(filename):
    index = 0
    while index < 10:
        print('creating file {}{}.txt'.format(filename, index))
        with open('{}{}.txt'.format(filename, index), 'w') as f:
            f.write(':)')
        index += 1

def main():
    t1 = threading.Thread(target=open_file, args=('hero',))
    t1.start()
    hello()

if __name__ == '__main__':
    main()

脚本运行正常,这是我得到的输出:

creating file hero0.txt
hello world
creating file hero1.txt
creating file hero2.txt
creating file hero3.txt
creating file hero4.txt
creating file hero5.txt
creating file hero6.txt
creating file hero7.txt
creating file hero8.txt
creating file hero9.txt
[Finished in 0.1s]

我在文档中发现deamon属性意味着脚本将在后台运行,因此我将脚本编辑为:

t1 = threading.Thread(target=open_file, args=('hero',), daemon=True)

但它不会一直在后台创建文件,它只会创建第一个文件

1 个答案:

答案 0 :(得分:0)

Python线程中的daemon属性是一种与Unix使用不同的“守护程序”。在Unix中,守护程序是可以不与终端关联运行的程序,或者可以说是在后台运行的程序。在Python中,这些线程是主线程在退出前不会检查的线程,因此,当主线程退出时,您创建的守护进程线程中仍在运行的任何线程都将在此时终止。不是守护程序线程的线程会在退出时由主线程等待,并且程序必须等到它们全部完成后才能结束。

因此,在您的程序中,由于您没有显式同步线程的退出,因此当它们不是守护程序时,主线程会在退出之前自动等待它们完成,因此将创建所有文件。当它们是守护程序时,它们将在主线程退出时终止,因此只有设法通过创建文件的线程才会创建文件,而其余的则不会。