这个函数及其输出背后的逻辑是什么? - 队列

What is the logic behind this function and its output? - Queue

q=  queue.Queue()
for i in [3,2,1]:
  def f():
    time.sleep(i)
    print(i)
    q.put(i)

  threading.Thread(target=f).start()

print(q.get())

对于这段代码,returns1. 之所以这样是因为队列是FIFO,并且“1”被放在最前面,因为它睡的时间最少。

扩展问题, 如果我继续 运行 q.get() 两次,它仍然输出相同的值“1”而不是“2”和“3”。谁能告诉我这是为什么?跟线程有关系吗?

另一个扩展问题, 当代码 运行ning 完全结束,但仍有线程未完成时,它们是否会在整个程序结束时立即关闭?

q.get()
#this gives me 1, but I suppose it should give me 2
q.get()
#this gives me 1, but I suppose it should give me 3

更新:

这是一个Python3码。

假设语言是Python3。

第二次和第三次调用q.get()return1因为三个线程各放一个1到队列中。队列中从来没有 23

我不完全理解在这种情况下会发生什么——我不是 Python 专家——但是函数 f 似乎没有出现在 capture循环变量的值,i。函数 f 中的 i 似乎与循环中的 i 是同一个变量,并且循环在三个线程中的任何一个从休眠中醒来之前就离开了 i==1 .因此,在所有三个线程中,i==1q.put(i) 被调用。


When the code finishes running completely, but there are still threads that haven't finished, will they get shut down immediately?

没有。在所有线程(包括主线程)都终止之前,该进程不会退出。如果您想要创建一个线程,当所有“正常”线程完成时,它会自动、强制、突然终止,那么您可以使该线程成为 守护线程。

请参阅 https://docs.python.org/3/library/threading.html,然后搜索“daemon”。