キューを使用したPythonマルチプロセッシングとZeroMQ IPC


10

ZeroMQを使用してPythonアプリケーションを作成し、ZGuideで説明されているMajordomoパターンのバリエーションを実装するのに忙しい

労働者とクライアントの仲介者としてブローカーを持っています。入ってくるすべてのリクエストに対して、いくつかの大規模なロギングを実行したいのですが、ブローカーがそのために時間を浪費したくありません。ブローカーはそのロギング要求を別のものに渡す必要があります。

私は2つの方法を考えました:-

  1. ロギング専用のワーカーを作成し、ZeroMQ IPCトランスポートを使用する
  2. キューでマルチプロセッシングを使用する

その点でどちらがより良いか、より速いかわかりません。最初のオプションでは、通常のワーカーで既に使用している現在のワーカー基本クラスを使用できますが、2番目のオプションの方が実装が早いようです。

上記についてのアドバイスやコメント、あるいは別の解決策が欲しいのですが。

回答:


4

ジョナサンが提案したような標準的なツールを使用するアプローチが好きです。作業しているOSについては言及していませんが、同じ精神に従って、Pythonの標準ロギングモジュールを一緒に使用しlogging.handlers.SysLogHandlerrsyslogサービスにロギングメッセージを送信することもできます(どのlinux / unixでも利用可能ですが、私はWindowsオプションもあると思いますが、私はそのオプションを使用したことがありません)。

基本的に、そのシステム全体は、あなたが考えているのと同じものを実装します。ローカルプロセスは、他のユーザーが処理、処理、または書き込むためのログメッセージをキューに入れます。この場合、他の誰か(rsyslog)は、多くの組み込み機能と柔軟性を備えた有名で実績のあるサービスです。

このアプローチのもう1つの利点は、製品が、syslogの上に構築された他のsysadminツールとよりよく統合されることです。そして、そのオプションを取得するためにコードを書く必要さえありません。


1
ホイールの再発明を回避する提案の+1。このように設計されたシステムを継承してもかまいません。それは仕事をうまくやり遂げますが、将来の修正のために多くの自由度を提供します。
evadeflow 2013年

2

リモートロギングを実装するための3番目の可能性を検討することもできます。標準のPythonロギングモジュールを使用する場合logging.QueueHandlerは、ワーカー、クライアント、ブローカーでlogging.QueueListenerクラスを使用し、リモートロギングプロセスでクラスを使用することを検討できます。

multiprocessing.Queueアプリケーションプロセスとロギングプロセスの間のトランスポートとして通常のPythonを使用する代わりにQueue、ダックタイピングでZeroMQを使用して独自の置換クラスを実装し、クラスを標準Pythonのドロップイン置換として使用しますQueue。このようにして、アプリケーションは、単一のマルチコアコンピューターから分散型データセンターまで、どのような環境でも変更せずに実行できます。

要約するとQueueHandler、すべてのワーカー、クライアント、ブローカーで標準のPythonロガーを使用し、選択しQueueListenerたPython loggingハンドラーに基づいて独立したプロセスを作成し、ログの重い処理を処理します。


Python 2.7を使用しています。QueueHandlerクラスはPython 3.2からしか利用できないと思います。
Imraan 2013

Python 3からコードを取得して、アプリの一部として直接使用するのは非常に簡単です。
ジョナサン

私はそれを試してみて、それが機能するかどうかを知らせます
Imraan

0

これらは根本的に異なるアプローチであり、それぞれに長所と短所のセットがあり、後の開発段階でパンニングする可能性が最も高くなります。

私は2つの方法を考えました:-

  1. ロギング専用のワーカーを作成し、ZeroMQ IPCトランスポートを使用する
  2. キューでマルチプロセッシングを使用する

一つの方法あなたが試みることができるあなたは、あなたの労働者がmemcacheのログクラスタにログインしてみましょう可能性アプローチ1のように、追加のログ・労働者を持っていることであり、与えられたリソースの負荷パラメータをdeceeding時に伐採労働者を監視現在のリソースの負荷と、ワーカーはIOPが制限されたデバイス(ハードディスクなど)にログを記録します。

ジョナサンのアプローチも気に入っています。私はほとんどPython 2.xを使用しているため、独自のロギングバックエンドを設定してパフォーマンスエンベロープを実際にプッシュしなければならない可能性があります。

私が間違っている場合は修正してください。ただし、ストレージIOPがボトルネックになっているため、データ集約型のタスクを実行していると思います。

それでも便利な方法は、ブローカーにbrokerageロギングを実行させることです。これは、説明されている形式で、中央ブローカーインスタンスのすべての欠点を伴うものです。たとえば、ブローカーが非常に需要が高く、memcachedログをストレージに書き戻す余裕がない場合は、別のアプローチをとる必要があります。

最終的にはブローカーレスモデルになる可能性があります。それは、彼らの間で彼らの仕事を管理している労働者と一緒です。簡単な例では、分散ラウンドロビンアルゴリズムを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.