1

私の目的は、一度に複数のWebサイトを処理し、1つ以上のクエリーも処理する分散クローラーを構築することです。 このために、私はPythonで 'requests'や 'BeautifulSoup'のような標準パッケージを使ってWebクローラーを構築しました。それはうまく動作します。 配布するために、私はrabbitMQを使いました。これにより、1つ以上のプロセスがクロールを支援することで、システムの高速化を実現できます。Pythonの分散コンピューティング - Webクローラー

私のシステムはworkpoolモデルで動作します:

  • 私は、メインサーバがクエリを受信し、それらのそれぞれのための新しいクロールを開始しています。
  • クロールを開始すると、クエリを検索エンジンに入力することによっていくつかのURLが収集されます。
  • これ以降、メインサーバーはrabbitMQで利用可能なワーカー/プロセスにURLを送信し、より多くのURLを受け取るのを待ちます。

しかし、私は、このアーキテクチャでは、巨大なボトルネックを持って、それがRabbitMQのは私が(channel.basic_qos()関数がない時点で1つの以上のメッセージを消費することはできません...メインサーバではありません作業!)。 私が欲しかったのは、(私が今行っていたように)各クエリーに対してプライベートキューを持ち、これらの2つのクエリーを同時に、できるだけ速く処理できることでした。つまり、一度に1つのURLではなく、最大量のURLを処理できるように、ワーカーコードを並列化します。

ここでrabbitMQを置き換えるにはどうすればよいですか?私は具体的にはrabbitMQの開発者に達しました。私が望むことはできませんので、私は別の '配布パッケージ'を探しています。多分カフカ?

答えて

0

まず、プログラムの制限事項を判断する必要があります。それはI/OバウンドかCPUバウンドですか?

など。プログラムの単純な非パラレルバージョンがネットワーク接続を飽和させる可能性がある場合、パラレルバージョンの作成には使用できません。

ウェブクローラの場合、究極のボトルネックとなるのはネットワークです。

しかし、十分なネットワーク容量があるとします。 その場合は、multiprocessing.Poolを使用することをおすすめします。 ワーカープロセスとして機能する関数は、URLを入力として受け取り、処理されたデータをURLから返します。 プールを作成し、imap_unorderedメソッドを使用して、ワーカー関数をURLのリストに適用します。 CPUはコアを持っているよう

def worker(url): 
    rv = requests.get(url) 
    # Do whatever processing is needed. 
    result = ... 
    return (url, result) 

urls = ['www.foo.com', ...] 
p = multiprocessing.Pool() 
for url, result in p.imap_unordered(worker, urls): 
    print('The URL ', url, 'returned ', result) 

デフォルトでは、Poolは、多くの労働者を使用します。より多くの労働者を使用することは一般的に有用ではありませ

ワーカーからの戻り値は、ワーカープロセスから親プロセスに返される必要があることに注意してください。だから、それは漬け物ができなければならない。膨大な量のデータを返さなければならない場合、IPCのボトルネックになる可能性があります。そのような場合には、例えば、 RAMベースのファイルシステムで、データファイルのファイル名を返します。

+0

あなたの答えをありがとう。マルチプロセッシングは、間違いなく並列化のアイデアです。 しかし、私が言ったように、私はクロールを分散させるためにrabbitmqを使用しています(多くのコンピュータ/プロセスが参加できます)、それがボトルネックの原因になっています。 – Skinishh