0

これが私の場合です。私は3つのテーブルを持ってBookPublisherますPrice。各本をループする管理コマンドがあり、各本について、出版社にクエリを実行して価格を取得し、それを価格テーブルに保存します。価格を取得するために行うのは、非常に単純なHTTPGETまたはUDPリクエストです。これが私のコードのスケルトンがどのように見えるかです:

@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の並列リクエストを行うことができましたが、これは簡単に実行できますが、このコードを構造化する方法がわかりません。

私のサイト自体は非常に小さくて軽量なサイトであり、RabbitMQ/Celeryのものから離れようとしています。今、それを引き受けるのは大きなことだと感じています。

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


編集#1:これは私が実際に行っていることのアナロジーとして使用されます。このアナロジーを書いているときに、私はいくつかのUDP要求も行う必要があることを言及するのを忘れました。

4

1 に答える 1

3

geventグリーンスレッドに基づいた準並列リクエスト処理を提供するrequestsパッケージを使用できます。多数のリクエストオブジェクトを作成し、それらを「並列」で実行できます。この例を参照してください。requests

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

于 2012-02-07T15:24:57.837 に答える