0

私はDjango/MySQL間のバグのように見えるものに取り組んできましたが、スレッド化されたアプリケーションなどのニュアンスについての私自身の誤解である可能性があります。

まず、私のアプリケーションに関する情報です。Djangoのモデルを使用しているPythonでプログラムされたマルチスレッドアプリケーションがあります。キューを使用してパイプラインに情報を提供するスレッドには、3つの異なるタイプがあります。スレッド1は、データベースから多数のオブジェクトをプルし、それらをキューにスローします。次のスレッド(主な主力製品)は、アイテムをキューから取り出し、HTTPリクエストをプルして、3番目のスレッドのキューにスローします。3番目のスレッドは、htmlに対していくつかの処理を実行し、いくつかのデータベース値を更新します。

これが奇妙な部分です。「レベル」というmysql列があります。最初のスレッドは、レベル= 0の行をプルします。HTTP応答を解析した後、最後のスレッドは、HTTPから解析されるすべての種類のデータとともに、データベース内の行をレベル=1で更新することになっています。フルスピードでは、スクリプトは1分間に約1,000を処理していると言っています。ただし、レベル= 1の行数は、その約1/3で増加します。ゆっくりと進むときの問題からの抜粋を次に示します。

正しい出力を示すプログラム出力の写真

重要なのは、「レベル1のエントリを更新する」という行です。最後の数字は、データベース内のレベル1の行数と、それに続く作業データオブジェクトの現在の「レベル」ステータスを示しています。この出力は、正しく機能している場合です。これは、次のコードブロックによって生成されます。

# update our current record to reflect having run here
current.update = datetime.now()
# this prints out the "updating level one" text with debugging information
self.send_message(304, str(Scrape.objects.filter(level=1).count()) + ":" + str(current.level))
current.level = 1
current.save()
# and after saving the information to the db, prints it out again
self.send_message(304, str(Scrape.objects.filter(level=1).count()) + ":" + str(current.level))
self.send_message(308, str(current.asin)) # send out a consuming message

ただし、しばらく実行すると、レベル= 1のオブジェクトの数が増えないことを除いて、基本的に同じ出力が得られます。これは私にはまったく意味がありません。以前は値が=0で、現在は= 1の場合、レベル=1エントリの数が増えるはずです。

これが単なるキャッシュではないと思いますが、おそらく、私が作成したエラーか、使用しているコンポーネントからの予期しない動作のいずれかです。より経験豊富な目からのアドバイスをいただければ幸いです。

4

2 に答える 2

0

私の当面の推測は、トランザクションの問題です。これらは別々のスレッドで実行されているため、独自のトランザクションがあり、トランザクション分離の対象になります。更新を行っているスレッドがトランザクションをコミットして新しいトランザクションを開始した場合でも、カウントを出力するスレッドは、新しいトランザクションを開始するまで、必ずしもその更新を確認するわけではありません。

于 2012-07-27T13:17:21.337 に答える
0

これを理解しました。解析されるアイテムのキューにデータを入力したのは、スレッドの見落としでした。レベル=0に一致する最初の30個の要素を取得しました。これらの要素はすでにキューにある可能性がありますが、まだ処理されていない可能性があります。夜遅くの愚かな間違いだと思います。

于 2012-07-27T21:19:23.017 に答える