我正在运行以下代码:
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