Python 3.3.1 にはおそらく気の利いた新しい非同期 API が含まれているため、今から数か月後に質問していればよかったのですが。現在のプロトタイプについてはhttp://code.google.com/p/tulip/を参照してください。ただし、おそらくまだ使用したくないでしょう。
Windows を使用している場合は、数百のスレッドを問題なく処理できる場合があります。もしそうなら、それはおそらく最も簡単な解決策です。だから、それを試してみてください。
Unix を使用している場合は、おそらくpoll
の代わりにを使用することをお勧めします。これは、数百の接続に到達するとスケーリングがうまくいかないselect
ためです。select
( epoll
Linux またはkqueue
Mac/BSD ではさらにスケーラブルですが、数千の接続に到達するまでは通常は問題になりません。)
ただし、これを自分で行う前に、考慮すべきことがいくつかあります。
Twisted
これらの中で最も使いこなすのが難しいのは間違いありませんが、すぐに使用できる IMAP クライアントが付属しており、数百もの他の機能が含まれているため、多少の学習曲線に対処する意思がある場合は、多くのことを完了できます。もっと早く。
Tornado
select
ネイティブ型のコードを書いているような気がします。付属のすべての機能を実際に知っているわけではありません。IMAP クライアントがあるかもしれませんが、そうでない場合は、 でimapclient
検討していたのと同じ方法でハッキングすることになりますselect
。
Monocle
は またはのいずれTwisted
かTornado
の上にあり、3.3.1 で登場するようなコードを Twisted または Tornado の上に書くことができます (ただし、実際には Twisted withinlineCallbacks
で直接同じことを行うことができますが、ドキュメントでは推奨されていません)。最初に他のすべてを学ぶことなく、それを学ぶことはできません)。繰り返しますが、imapclient
ここでハッキングすることになります。(または、Twisted
代わりに の IMAP クライアントを使用しますが、その時点で、Twisted
直接使用することもできます。)
gevent
スレッド (または同期) コードとほぼ同じコードを記述でき、魔法のように非同期になります。少しハックする必要があるimapclient
かもしれませんが、それは魔法の monkeypatching ユーティリティを実行するのと同じくらい簡単かもしれません。さらに、スレッドの束ではなくグリーンレットの束を作成することを除いて、スレッド化で作成するのと同じコードを作成し、1 桁または 2 桁優れたスケーラビリティーが得られます。
絶対的な最大のスケーラビリティを探している場合は、並列化と多重化を同時に行いたいと思うでしょう (たとえば、gevent
Unix でそれぞれ を使用して 8 つのプロセスを実行するか、Windows でネイティブ スレッドプールを IOCP に接続します)。数百の接続は必要ありません。