2

複数の (最大で数百になる可能性がある) メール アカウントの新しいメッセージをチェックできる小さなデーモンを作成する必要があります。

これまでの私の考え:

imapclientを使用して x 秒ごとにメッセージを取得するか、可能な場合は IMAP IDLE を使用して、接続ごとに新しいスレッドを作成するだけです。また、imapclient を少し変更しselect()、IMAP IDLE が単一のスレッドのみを使用してアクティブ化されているすべてのソケットを変更することもできます。

このタスクを解決するためのより良いアプローチはありますか?

4

1 に答える 1

1

Python 3.3.1 にはおそらく気の利いた新しい非同期 API が含まれているため、今から数か月後に質問していればよかったのですが。現在のプロトタイプについてはhttp://code.google.com/p/tulip/を参照してください。ただし、おそらくまだ使用したくないでしょう。

Windows を使用している場合は、数百のスレッドを問題なく処理できる場合があります。もしそうなら、それはおそらく最も簡単な解決策です。だから、それを試してみてください。

Unix を使用している場合は、おそらくpollの代わりにを使用することをお勧めします。これは、数百の接続に到達するとスケーリングがうまくいかないselectためです。select( epollLinux またはkqueueMac/BSD ではさらにスケーラブルですが、数千の接続に到達するまでは通常は問題になりません。)

ただし、これを自分で行う前に、考慮すべきことがいくつかあります。

Twistedこれらの中で最も使いこなすのが難しいのは間違いありませんが、すぐに使用できる IMAP クライアントが付属しており、数百もの他の機能が含まれているため、多少の学習曲線に対処する意思がある場合は、多くのことを完了できます。もっと早く。

Tornadoselectネイティブ型のコードを書いているような気がします。付属のすべての機能を実際に知っているわけではありません。IMAP クライアントがあるかもしれませんが、そうでない場合は、 でimapclient検討していたのと同じ方法でハッキングすることになりますselect

Monocleは またはのいずれTwistedTornadoの上にあり、3.3.1 で登場するようなコードを Twisted または Tornado の上に書くことができます (ただし、実際には Twisted withinlineCallbacksで直接同じことを行うことができますが、ドキュメントでは推奨されていません)。最初に他のすべてを学ぶことなく、それを学ぶことはできません)。繰り返しますが、imapclientここでハッキングすることになります。(または、Twisted代わりに の IMAP クライアントを使用しますが、その時点で、Twisted直接使用することもできます。)

geventスレッド (または同期) コードとほぼ同じコードを記述でき、魔法のように非同期になります。少しハックする必要があるimapclientかもしれませんが、それは魔法の monkeypatching ユーティリティを実行するのと同じくらい簡単かもしれません。さらに、スレッドの束ではなくグリーンレットの束を作成することを除いて、スレッド化で作成するのと同じコードを作成し、1 桁または 2 桁優れたスケーラビリティーが得られます。

絶対的な最大のスケーラビリティを探している場合は、並列化と多重化を同時に行いたいと思うでしょう (たとえば、geventUnix でそれぞれ を使用して 8 つのプロセスを実行するか、Windows でネイティブ スレッドプールを IOCP に接続します)。数百の接続は必要ありません。

于 2013-01-06T13:32:27.720 に答える