与Python 2/3中的线程不同的结果

时间:2016-09-06 15:54:19

标签: python python-3.x python-2.x

下面是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

1 个答案:

答案 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()