在必须轮询以了解是否有工作要做的工作线程的主循环中,我让它休眠以免忙等待。如何确定合适的 sleep 长度?例如如果我每毫秒醒来一次,那么 sleep 可能根本没用。如果我每十分钟醒来一次,可能会使应用程序看起来没有响应(取决于线程在做什么)。
我在下面 cadrian 所说的之前听说过,人类用户不会注意到大约 100 毫秒的时间跨度,但是从机器端接近它呢?在开始变得浪费之前,间隔可以变得多小?
我想,它归结为 this question 的更通用(即平台无关)版本.
编辑:当然,这个问题应该始终首先改写为“我如何将其更改为事件模式而不是轮询”,但现在让我们假设我不能或不想。
最佳答案
有时投票就是答案 .
但是,它轮询的频率取决于线程在做什么,因此请使其可配置。
我们有线程可以检查电子邮件。他们可以检查外部邮箱,我们每三十秒左右只检查一次邮箱(但它是可配置的)。每次检查都是通过网络调用,每秒调用一次或 10 秒调用一次会破坏网络,30 秒是可以的,如果电子邮件在它进入收件箱的那一刻未被处理并不重要(但是一些客户站点每 5 分钟检查一次)。
我们还有其他线程轮询文件夹中的文件和/或添加到数据库表中的新请求。这些工作每 1 到 5 秒轮询一次(取决于他们在做什么)。
现在无论您在轮询之间等待多长时间,我们都不会让任何线程休眠超过一秒。原因是,如果您尝试停止一个线程休眠 60 秒的 Windows 服务,您可能在服务停止前等待 60 秒。
如果您需要赶紧将机器停机,Rip Van Winkle 线真的会扭曲您的西瓜。
因此,让您的轮询间隔尽可能远,但 sleep 时间不要超过一秒钟。
希望这可以帮助
关于multithreading - 当事件模式不适用时,线程应该休眠多长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/582367/