我需要一种方法来限制我的IRC机器人上的消息计数,以避免全球禁止因聊天泛滥而被抽搐。 (它们允许100条消息/ 30秒)
我认为有两种方法都涉及消息队列。
每条消息都会启动一个带有计数信号量的线程。然后该线程阻塞30秒并在此之后释放。这将是一个非常干净的解决方案,因为队列将完全由操作系统管理,这对我来说意味着更少的工作,但是,它可能导致创建数百个线程。这些线程将在其生命的大部分时间内处于休眠状态,但我不确定是否可以有效地启动数百个无效的线程。当他们睡着时,他们不会从调度程序中占用时间片,但是他们会占用大量内存,创建它们会有很多开销。
存储一叠时间戳,如果时间戳大于30秒,则每次需要发送消息时将其删除。运行一个线程,每隔10-50ms检查堆栈底部,看看时间戳是否> 30秒,如果是,则删除,然后从队列中最高位置发送一条消息如果存在则被发送。当有消息进入时,如果队列中有<#消息,则立即发送消息。
1的缺点是创建了许多无效的线程。
2的缺点是需要1个线程不断轮询消息列表。
2可以改进以计算等待堆栈中的底部消息为30秒之前所需的时间然后发送消息,但我感觉好像我在那个阶段过度复杂化了问题。
有哪些想法会更好的方法?
答案 0 :(得分:0)
创建一个sentMessage列表,其中包含每个条目的日期。
在发布新消息之前检查列表。