0

2 つの外部スクリプトを使用する django アプリがあります。1 つのスクリプトは、ファイルを A から B に移動し、B の値をデータベースに保存します。その後も存在し、開いている可能性のあるトランザクションをコミットする必要があります。次のスクリプトは、(inotify を使用して) ファイルの移動に反応し、md5sum を計算し (これには時間がかかるようです)、データベース内の のようなエントリを探します x = Queue.get(filename=location)。ログのタイムスタンプを見ると、最初のスクリプトが完了してから 2 番目のスクリプト (実際にはデーモン) がクエリを実行することは 100% 確実です。興味深いことに、デーモンの再起動後は完全に機能します。

これは、どういうわけかクエリセット (inotify で新しいファイルが検出されるたびに上記のコードを実際に実行する) がデーモンの実行時にキャッシュされると信じさせます。ただし、デーモンを常に再起動したくはありませんが、代わりに、クエリがそのキャッシュの代わりに実際に DB を使用するように強制します。

django のドキュメントでは、それについてあまり語られていませんが、通常、django は外部としては使用されません :)

ヒントをよろしくお願いします!

ベン

PS:リクエストに応じて、デーモンからの関連部分のソース

def _get_info(self, path):
    try:
        obj = Queue.objects.get(filename=path)
        x = obj.x
        return x
    except Exception, e:
        self.logger.error("Error in lookup: %s" % e)
        return None

これは、新しいファイルが監視ディレクトリに移動されるたびにスレッドによって呼び出されます

最初のスクリプトのコードは次のようになりますが、

for f in Queue.objects.all():
    if (matching_stuff_here):
         f.filename = B
         f.save()    
         sys.exit(0)
4

1 に答える 1

0

実際のコードは表示されていないため、推測する必要があります。私の推測では、最初のスクリプトのトランザクションが完了してコミットされたとしても、スクリプト B ではまだ開いているトランザクションの中にいると思います。トランザクションが分離されているため、トランザクションが完了するまで B の変更は表示されません。そこの。

于 2012-08-21T10:21:04.150 に答える