Python 2/3中线程的不同结果
下面是Python 3中的代码。它总是可以得到100000。为什么是错的?我认为应该有不同的结果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)
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()