2012-02-07 7 views
0

私の場合です。私は3つのテーブルBookPublisherPriceを持っています。私は各書籍についてループを繰り返す管理コマンドを持っており、各書籍については価格を入手するために出版社に問い合わせ、価格表に格納します。それは私が価格を得るために作る非常に簡単なHTTP GETまたはUDP要求です。ここに私のコードのスケルトンがどのようなものか:ヘルプが必要なパラレルHTTPリクエストの構成

@transaction.commit_on_success 
def handle(self, *args, **options): 
    for book in Book.objects.all(): 
     for publisher book.publisher_set.objects.all(): 
      price = check_the_price(publisher.url, book.isbn) 
      Price.objects.create(book=book, publisher=publisher, price=price) 

コードはシンプルですが、私は10000冊の本を持っている場合、それはかかり本当に遅いと時間を取得します。私は簡単に並列HTTPリクエストを作成することでこれをスピードアップすることができます。私は50のパラレルリクエストを作成することができますが、これはjiffyで実行されますが、このコードをどのように構造化するかはわかりません。

私のサイト自体は非常に小さくて軽量なサイトで、私はRabbitMQ/Celeryのものから離れようとしています。私はちょうどそれが今取る大きな事だと感じています。

トランザクションの整合性を維持しながらこれを行う方法に関する推奨事項はありますか?


編集#1:これは私が実際にやっていることの類推として使用されます。この類推を書いて、私はいくつかのUDP要求をする必要があることを忘れていました。

+0

操作全体に対してトランザクションの整合性が本当に必要ですか?あなたは価格の日付を更新し、単価ごとの取引をすることはできませんか? – Macke

+0

私が欲しかったのは、何らかの理由でコマンドがクラッシュしたり、この長期間にいくつかのエラーが発生した場合、何も保存されないということです。私がその問題を回避できるより良い方法があれば、それを喜んで使用します。ありがとう。 –

答えて

3

geventgreen threadsに基づく準並列要求処理を提供するrequestsパッケージを使用できます。 requestsを使用すると、多数の要求オブジェクトを構築し、それらを「並列」で実行することができます。 this exampleを参照してください。

グリーンスレッドは実際には並行して実行されませんが、協調して実行制御が行われます。 geventは、標準ライブラリのI/O機能(urllib2で使用されるものなど)にパッチを適用して、そうでない場合はI/Oでブロックするたびにコントロールを生成できます。 requestパッケージは、それを単一の関数呼び出しにラップし、多数の要求を受け取り、多数の応答オブジェクトを返します。それよりずっと簡単にはなりません。

+0

このライブラリを見逃してしまったことはありますか?私の用途の多くは素晴らしいと思います。もし私ができるなら、私はあなたのアップフォートをすべて捧げます、サイモン。ありがとう。問題はいくつかのUDPリクエストを作成する必要があることです。本、出版社、価格は、私が取り組んでいることの類推のようなものでした。私は誤ってUDPビットを省略しました。私はこのモジュールを使ってUDPリクエストを行うことはできません。おかげさまで、ご迷惑をおかけしました。 –

+1

私はPythonでUDPを使用しませんでしたが、通信部分を行ういくつかの 'ソケット'ベースのコードを持っていると仮定すると、 'gevent'を使ってそれを並列化することができます。 – Simon

+0

うん、私はソケットモジュールを使用しています。私はgeventと一緒に働いたことはないが、私はそれを読み上げるだろう。スレッドとキューを使用するソリューションはどのように鳴りますか?この例のように:http://www.ibm.com/developerworks/aix/library/au-multiprocessing/ –

関連する問題