删除 print 会减慢 while 循环

Removing print slows down the while loop

我希望我的 python 文件等待所有线程关闭。 我正在使用下一个代码:

threadslist=int(threading.active_count())
while threadslist>1:
  threadslist=int(threading.active_count())

print(Fore.BLUE+"Scan of ports Ended in:"+Style.RESET_ALL, Fore.GREEN+str(round(time.time()-start_time))+Style.RESET_ALL, "s")

有了这个代码,我得到了这个: Scan of ports finished in 128 s 但是,当我将 print(threadslist) 放入 while 循环时,它会加速。 第二个代码:

threadslist=int(threading.active_count())
while threadslist>1:
  threadslist=int(threading.active_count())
    print(threadslist)
print(Fore.BLUE+"Scan of ports Ended in:"+Style.RESET_ALL, Fore.GREEN+str(round(time.time()-start_time))+Style.RESET_ALL, "s")

现在我得到: Scan of ports Ended in 26 s 为什么在没有打印的情况下完成循环需要更长的时间,而不是有打印? 当我不检查线程结束时,我有 20 秒的时间,python 等待 6 秒,所以第二次是正常的。

忙循环不是等待线程结束的有效方法。当您这样做时,您将用掉数十亿个 CPU 周期,只需简单地调用一个函数并一遍又一遍地检查其结果。

更糟糕的是,在 Python 中,您隐含地持有 GIL 来执行此操作,这意味着您的其他线程在大部分时间都不能 运行。这就是减慢他们执行速度的原因。添加 print 语句意味着你的主线程至少在某些时候做 I/O,这允许你的其他线程更频繁地获取 GIL,因此完成得更快。

主线程正确的做法是在每个生成的线程上按顺序调用 join()。这将产生相同的效果,但不会浪费 CPU 个周期,因为 join() 将有效地 block/sleep 直到线程退出