【发布时间】:2015-01-08 22:11:16
【问题描述】:
我需要一种方法来限制我的 IRC 机器人上的消息计数,以避免全球禁止 twitch 导致聊天泛滥。 (它们允许 100 条消息/30 秒)
我考虑过两种方法都涉及到消息队列。
每条消息都会启动一个线程,该线程接受一个计数信号量。然后该线程阻塞 30 秒并在此时间后释放。这将是一个非常干净的解决方案,因为队列将完全由操作系统管理,这对我来说意味着更少的工作,但是,它可能会导致创建数百个线程。这些线程将在其生命周期的大部分时间里处于休眠状态,但我不确定是否可以有效地启动数百个什么都不做的线程。它们在睡眠时不会占用调度程序的时间片,但它们会消耗大量内存,并且在创建它们时会产生大量开销。
存储时间戳堆栈,如果时间戳超过 30 秒,则在每次需要发送消息时将其删除。让一个线程运行,每(10-50ms)检查一次堆栈底部,以查看时间戳是否超过 30 秒,如果是则删除,然后从队列中尚未完成的最高位置发送消息如果存在则发送。当有消息要发送时,如果队列中有
1 的缺点是创建了许多什么都不做的线程。
2 的缺点是需要 1 个线程不断轮询消息列表。
2 可以改进以计算等待堆栈中的底部消息达到 30 秒并随后发送消息所需的时间,但我觉得我在那个阶段让问题过于复杂。
有什么更好的方法吗?
【问题讨论】:
标签: java multithreading message-queue irc