Time.Sleep似乎正在阻止主线程,而不仅仅是子线程



我正在运行以下代码:

from threading import Thread
from time import sleep
def file_write(file_input, num_lines):
    sleep(10)
    file = open("testfile.txt", "w")
    for line in num_lines:
        file.write("{}: {}".format(line, file_input))
    file.close()

if __name__ == '__main__':
    curr_thread = Thread(target=file_write, args=("Norah", range(5)))
    curr_thread.daemon = False
    curr_thread.start()

期望是主线程将立即退出,因为我不打电话加入。但事实并非如此。睡眠通话也会阻止主线程吗?

编辑:此线程中有一个类似的问题:time.sleep-睡觉或过程?但这并不相同。
我看着线程:它说睡眠不会导致儿童过程彼此阻止,但没有说明主线程会发生什么。当我从接受的答案中运行代码时,主线程不会立即退出,就像我想的那样。

更新:看起来多线程无法解决我的问题:目的是在后台运行一堆任务。我现在正在使用子过程模块。

睡眠呼叫仅阻止其称为螺纹。致电curr_thread.start()后立即打印主线程中的任何内容都会向您证明这一点。

但是,如果中断代码(CTRL-C),您会看到一个有用的堆栈跟踪。最后一个呼叫在threading模块的_shutdown()方法中,该方法似乎正在等待所有 non-daemon 线程完成。

t = _pickSomeNonDaemonThread()
while t:
    t.join()
    t = _pickSomeNonDaemonThread()

并读取线程模块的文档,您可以看到:"当没有活着的非daemon线程时,整个Python程序将退出。"因此,由于您已经完成了curr_thread.daemon = False,因此您正在强迫主线程等待此线程先完成。

我应该指出的是,该线程继承了父母的"守护程序"。由于主线程绝不是守护程序线程,因此您可以删除curr_thread.daemon = False,并且您会得到相同的行为。

当然,线程中的睡眠不会阻止主线程。

此代码表明主要继续:

from threading import Thread
from time import sleep
def file_write(file_input, num_lines):
    print('a')
    sleep(5)
    print('b')

if __name__ == '__main__':
    curr_thread = Thread(target=file_write, args=("Norah", range(5)))
    curr_thread.daemon = False
    curr_thread.start()
    for i in range(5):
        sleep(1)
        print(i)

输出:

a
0
1
2
3
b
4

最新更新