正在运行数千个线程,其中大部分包含睡眠,资源昂贵?
我正在开发一个电报API机器人。正在运行数千个线程,其中大部分包含睡眠,资源昂贵?
聊天组中的玩家将启动一个游戏,创建一个具有处理游戏流程任务的线程。
机器人有不同的游戏玩,每个游戏有不同的游戏处理。
例如,一个游戏是基于回合的游戏。机器人随机选择一个玩家,并告诉他们做什么(不讨论),当玩家的时间结束时(通常为一分钟),机器人将为其他玩家创建一个投票,玩家应该投票选择他正常工作。如果超过一半的玩家接受,那么这个过程将重复其他玩家,直到所有玩家玩一次,然后游戏结束。
还有一些其他的游戏,这只是用于介绍。
现在,父级游戏类(抽象)有一个Thread getThread();
方法,Childs将会覆盖以返回他们自己的游戏进程实现。
这种方法是否太耗资源?通常,10到500个游戏在同一时间运行,大部分线程花费的时间是Thread.sleep
,这是性能劣势吗?
几乎所有使用thread.sleep的代码都会因资源匮乏(因为它轮询频率过高)或无响应(因为它不经常进行轮询)。
每次调用sleep()
时,操作系统需要安排不同的本地线程运行,然后执行线程切换。这不是一个便宜的操作。乘以数以千计的线程切换每秒,你会占用你的CPU时间的重要百分比的开销。
对于多线程来说,更高效和响应的方法是使用wait/notify ....或者构建在wait/notify或等价物之上的更高级别的并发构造。
而且还有更多的高性能方法(例如fork/join或reactor pattern),但它们会引发对您的问题的不同思考方式。但是如果您发现自己的实现架构需要数百或数千个线程,那么您可能需要重新考虑做。每个线程只使用现有的大量资源(例如内存)。
那么,实现事物I的最佳实践是什么想?反应堆模式真的很糟糕,不是面向对象的。 –
“坏”不是一个客观的术语。 “最佳做法”更糟(参见http://www.satisfice.com/blog/archives/27)。但是线程确实比反应堆更容易实现。但无论你做什么,都不要使用'睡眠'... –
感谢您的博客文章,我学到了宝贵的经验教训。如何在等待/通知的行动之间实施延迟?我搜索,但从我见过的东西,他们没有关系。纠正我,如果有办法。 –
线程确实需要资源,即使他们没有做任何事情。但是,如果他们大多数时间没有做任何事情,那么使用不需要您无故创建大量睡眠线程的体系结构可能是一个更好的主意。如通过安排事件。 – Kayaman
为什么downvoting? –
你推荐使用哪种架构? @Kayaman –