【问题标题】:Removing print slows down the while loop删除打印会减慢 while 循环
【发布时间】:2021-11-24 06:08:41
【问题描述】:

我希望我的 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 秒,所以第二次是正常的。

【问题讨论】:

  • 为什么不只是join() 循环中的所有线程?像这样的连续轮询效率低下。
  • 你可以试试print(...),而不是time.sleep(0.1)。这可能会进一步改善运行时间。最终正如已经指出的那样,.join() 是要走的路。
  • .join 需要很长时间,因为我已经生成了 65k 个线程。我可能是错的,但你认为会发生的事情
  • 好吧,您似乎已经设置了某种性能检查。也许您现在可以先尝试time.sleep(0.1),然后依次循环到.join() 每个线程。

标签: python python-3.x multithreading while-loop python-multithreading


【解决方案1】:

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

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

你的主线程正确的做法是在每个生成的线程上依次调用 join()。这将产生相同的效果,但不会浪费 CPU 周期,因为 join() 将有效地阻塞/休眠,直到线程退出

【讨论】:

  • 问题是,我生成了 65k 线程,加入它们需要时间,不是吗?
  • 不要生成 65k 线程……太多了。如果你认为你需要那么多,你应该改用线程池。
猜你喜欢
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2016-12-21
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多