作者:好运娟_968 | 来源:互联网 | 2023-01-31 18:55
我运行了这段代码
NUM = 0
def count():
global NUM
NUM += 1
time.sleep(1)
print(t.getName()+":"+"NUM is "+str(NUM))
for i in range(10):
t = threading.Thread(target=count)
t.start()
输出是
Thread-10:NUM is 10
Thread-10:NUM is 10
Thread-10:NUM is 10
Thread-10:NUM is 10
Thread-10:NUM is 10
Thread-10:NUM is 10
Thread-10:NUM is 10
Thread-10:NUM is 10
Thread-10:NUM is 10
Thread-10:NUM is 10
我知道为什么NUM总是10,但为什么线程名称总是相同的?每个线程运行print(t.getName()+":"+"NUM is "+str(NUM))
; 的t
不应该是得到的CPU时间的一个线程?我认为这个名字不应该是一样的.
当我改变这个
NUM = 0
def count():
global NUM
NUM += 1
name = t.getName()
time.sleep(1)
print(name+":"+"NUM is "+str(NUM))
for i in range(10):
t = threading.Thread(target=count)
t.start()
它按预期工作:
Thread-1:NUM is 10
Thread-3:NUM is 10
Thread-2:NUM is 10
Thread-4:NUM is 10
Thread-5:NUM is 10
Thread-7:NUM is 10
Thread-10:NUM is 10
Thread-9:NUM is 10
Thread-6:NUM is 10
Thread-8:NUM is 10
Tim Peters..
7
这是因为您引用了全局名称t
.当休眠结束时,循环结束,并t
保持绑定到循环创建的最后一个线程(第10个线程).
在您的替代方案中,结果实际上并未定义.在那里,你引用全局t
而循环仍在运行,因此很可能被绑定到创建的最新话题-但不具备如此.
注意:如果您无法方便地访问当前运行的线程对象,则可以使用
threading.currentThread()
为拿到它,为实现它.然后
threading.currentThread().getName()
将返回运行它的线程的名称.
1> Tim Peters..:
这是因为您引用了全局名称t
.当休眠结束时,循环结束,并t
保持绑定到循环创建的最后一个线程(第10个线程).
在您的替代方案中,结果实际上并未定义.在那里,你引用全局t
而循环仍在运行,因此很可能被绑定到创建的最新话题-但不具备如此.
注意:如果您无法方便地访问当前运行的线程对象,则可以使用
threading.currentThread()
为拿到它,为实现它.然后
threading.currentThread().getName()
将返回运行它的线程的名称.