Time.sleep似乎阻塞主线程,而不仅仅是子线程?

时间:2017-09-21 18:13:15

标签: python multithreading 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 -- sleeps thread or process?但它不一样。
我查看了这个帖子:它说睡眠不会导致子进程相互阻塞,但它并没有说明主线程发生了什么。当我从接受的答案中运行代码时,主线程没有立即退出,就像我想的那样。

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

2 个答案:

答案 0 :(得分:1)

睡眠呼叫仅阻止他们呼叫的线程。在致电curr_thread.start()后立即在主线程中打印任何内容都将证明这一点。

但是,如果您中断代码(Ctrl-C),您将看到有用的堆栈跟踪。最后一次调用位于threading模块的_shutdown()方法内,该方法似乎正在等待所有非守护进程线程完成。

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

读取线程模块的the documentation,您可以看到:"当没有剩下活着的非守护程序线程时,整个Python程序退出。"所以,因为你已经完成了curr_thread.daemon = False,所以你强迫主线程等待这个线程先完成。

但是,我应该指出,线程继承了#34; daemon-ness"他们的父母。由于主线程永远不是守护程序线程,因此您可以不使用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