我正在运行以下代码:
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 -- sleeps thread or process?但它不一样。
我查看了这个帖子:它说睡眠不会导致子进程相互阻塞,但它并没有说明主线程发生了什么。当我从接受的答案中运行代码时,主线程没有立即退出,就像我想的那样。
更新:看起来多线程不能解决我的问题:目的是在后台运行一堆任务。我现在正在使用子进程模块。
答案 0 :(得分:1)
睡眠呼叫仅阻止他们呼叫的线程。在致电curr_thread.start()
后立即在主线程中打印任何内容都将证明这一点。
但是,如果您中断代码(Ctrl-C),您将看到有用的堆栈跟踪。最后一次调用位于threading
模块的_shutdown()
方法内,该方法似乎正在等待所有非守护进程线程完成。
t = _pickSomeNonDaemonThread()
while t:
t.join()
t = _pickSomeNonDaemonThread()
读取线程模块的the documentation,您可以看到:"当没有剩下活着的非守护程序线程时,整个Python程序退出。"所以,因为你已经完成了curr_thread.daemon = False
,所以你强迫主线程等待这个线程先完成。
curr_thread.daemon = False
,并且您将获得相同的行为。
答案 1 :(得分:0)
当然,线程中的睡眠不会阻塞主线程。
此代码演示了main继续:
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