Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2/3中线程的不同结果_Python_Python 3.x_Python 2.x - Fatal编程技术网

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

Python 2/3中线程的不同结果,python,python-3.x,python-2.x,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)

下面是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中的代码。它总是有不同的结果(随机)


CPython2允许线程在执行一定数量的字节码后切换;CPython 3.2更改为允许线程在经过一定时间后切换。您的
test()
执行大量字节码,但占用的时间很少。在我的框中,在Python 3下,如果我在开始处添加以下内容,则显示的结果将变得不可预测:

import sys
sys.setswitchinterval(sys.getswitchinterval() / 10.0)
也就是说,允许线程在经过的时间比默认时间少10倍后切换

还请注意,Python3中强烈反对使用
\u-thread
:这就是为什么添加了前导下划线。使用
threading.Thread
,例如:

for i in range(10):
    t = threading.Thread(target=test)
    t.start()

Python3在循环中的迭代速度要快得多,请尝试设置
sleep(1)
i in range(10000)
查看我的答案:Python3中的迭代速度并不是更快。这就是何时允许线程切换的标准发生了变化。
for i in range(10):
    t = threading.Thread(target=test)
    t.start()