根据我的理解,IMAP要求每个用户建立连接。我正在编写一个IMAP客户端(目前只是gmail),它一次支持许多(100s,1000s,10000s +)用户。显然,减少打开连接的数量会很棒。我想知道是否有可能在我这边使用线程池通过IMAP连接到gmail,或者IMAP协议是否支持它。
答案 0 :(得分:2)
IMAP通常使用SSL over TCP / IP。并且需要为每个IMAP客户端连接维护TCP / IP连接,这意味着将有许多同时打开的连接。
可以在非线程(单线程)实现中轻松维护这些多个并发连接,而不会影响TCP连接的状态。您必须为每个IMAP TCP / IP连接提供某种流概念,并使用TCP / IP五元组(或socketFd)将所有流存储在容器(例如c ++ STL映射)中键。对于收到的每个数据包,查找流并相应地处理数据包。这种方法没有任何内容会影响TCP或IMAP连接。
考虑到这将在单线程环境中工作,添加线程池只会增加应用程序的吞吐量,因为您可以同时处理多个流的数据包(假设它是一个多核CPU)您将只是需要确保2个线程不会同时处理同一个流的数据包,这可能导致数据包无序处理。一种方法可以是每个线程有一组流,可能使用IP池或类似的东西。