这个函数及其输出背后的逻辑是什么? - 队列
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
到队列中。队列中从来没有 2
或 3
。
我不完全理解在这种情况下会发生什么——我不是 Python 专家——但是函数 f
似乎没有出现在 capture循环变量的值,i
。函数 f
中的 i
似乎与循环中的 i
是同一个变量,并且循环在三个线程中的任何一个从休眠中醒来之前就离开了 i==1
.因此,在所有三个线程中,i==1
到 q.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”。
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
到队列中。队列中从来没有 2
或 3
。
我不完全理解在这种情况下会发生什么——我不是 Python 专家——但是函数 f
似乎没有出现在 capture循环变量的值,i
。函数 f
中的 i
似乎与循环中的 i
是同一个变量,并且循环在三个线程中的任何一个从休眠中醒来之前就离开了 i==1
.因此,在所有三个线程中,i==1
到 q.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”。