下面是Python 3中的代码。它总是可以得到100000.为什么它错了?我认为它应该有不同的结果。
import time, _thread
global count
count = 0
def test():
global count
for i in range(0, 10000):
count += 1
for i in range(0, 10):
_thread.start_new_thread(test, ())
time.sleep(5)
print(count)
下面是Python 2中的代码。它总是有不同的结果(随机)。
import time, thread
global count
count = 0
def test():
global count
for i in range(0, 10000):
count += 1
for i in range(0, 10):
thread.start_new_thread(test, ())
time.sleep(5)
print count
答案 0 :(得分:5)
CPython 2允许线程在执行了一定数量的字节代码后切换; CPython 3.2更改为允许线程在经过一定时间后切换。您的test()
执行大量字节代码,但消耗的时间很少。在我的方框中,在Python 3下,如果我在开头附近添加,则显示的结果变得不可预测:
import sys
sys.setswitchinterval(sys.getswitchinterval() / 10.0)
也就是说,允许线程在经过10次(比默认值)时间后切换。
另请注意,在Python 3中强烈建议不要使用_thread
:这就是添加前导下划线的原因。改为使用threading.Thread
,例如:
for i in range(10):
t = threading.Thread(target=test)
t.start()