Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
需要同时收听来自数千个(未来可能更多)IMAP 服务器的响应。有什么有效的方法来做到这一点?
我能想出的唯一解决方案是为每个连接创建一个线程。这是要走的路吗?
仅供参考,我将在 Ruby 中实现它,但我想选择的语言对于这个问题并不重要。
它是一个简单且经过测试的解决方案:
1)每个套接字的请求侦听器线程,您必须从中侦听请求(如果一个套接字则为 1,依此类推)
2)将请求放入处理队列(像生产者一样)
3)拥有将接受这些请求并处理它们的服务线程(消费者)。您可以有多个消费者线程。
注意:服务线程应始终使用执行器框架,以便将工作重新分配给线程并重用线程。
每个线程的连接只会导致线程饥饿,完全不推荐。如果你自己做,那么我会推荐一个大小的线程池(从核心数 +1 开始。我认为你仍然可以增加大小,因为它主要是 I/O。配置文件并保持上限)。
(我不知道 ruby 和线程(我猜 Ruby 有GIL问题)所以可能是一个过程)
但推荐的是让网络服务器为你做这件事。例如,使用一个接受请求的网络服务器并执行逻辑。Web 服务器的设计比手动调整更适合处理这种情况。