20

Django で数分ごとに SQLite データベースにデータを入力する必要がありますが、データベースが更新できるようになるまで古いデータを提供したいと考えています。(つまり、データが収集されるのをブロックしたくありません。ブロックできるのは、データベースにロックがかかっている場合だけで、その間は選択の余地がありません。)

また、別のプログラムやライブラリをインストールしたくありません。

save()スレッドの問題に遭遇することなく、一連のモデルを呼び出すことができる別のスレッドを設定するにはどうすればよいでしょうか?

4

6 に答える 6

19

本格的なタスク管理システムではなく、バックグラウンドで実行するための軽量なソリューションを探している場合は、django-utilsをご覧ください。とりわけ、別のスレッドで関数を非同期的に実行する@async関数デコレータが含まれています。

次のように使用します。

from djutils.decorators import async

@async
def load_data_async():
    # this will be executed in a separate thread
    load_data()

次に、バックグラウンド用、または実行をブロックload_data_async functionする通常の関数のいずれかを呼び出すことができます。load_data

@async デコレータがないため、2.0 より前のバージョンを必ずインストールしてください。

注: django-utils をインストールするだけでも多すぎる場合は、単純にダウンロードして、必要なファイルをいくつかプロジェクトに含めることができます。

于 2012-02-11T09:04:15.140 に答える
17

セロリ

Celery は、分散メッセージ パッシングに基づく非同期タスク キュー/ジョブ キューです。リアルタイム操作に重点を置いていますが、スケジューリングもサポートしています。

Celery は Python で記述されていますが、プロトコルは任意の言語で実装できます。Webhook を使用して他の言語で操作することもできます。

于 2011-07-06T22:12:51.603 に答える
5

読者の観点からアトミックに見えるように更新が必要かどうかによって異なります。古いデータと新しいデータを一緒に表示してもかまわない場合は、データを入力するカスタム管理コマンドを作成し、 cronから数分ごとに実行します。

アトミックに見えるようにする必要がある場合は、 django.db.transactionを介してすべての書き込みを1つのSQLiteトランザクションにラップすると、おそらく必要なロックが提供されます。

于 2011-07-06T20:56:14.373 に答える
4

Django Background Taskは、Ruby の DelayedJob ライブラリに大まかに基づいた、Django 用のデータベースを利用したワーク キューです。

関数をデコレートしてタスクを作成します。

@background(schedule=60)
def notify_user(user_id):
    # lookup user by id and send them a message
    user = User.objects.get(pk=user_id)
    user.email_user('Here is a notification', 'You have been notified')

ただし、これらのタスクをスケジュールする何かが必要です。いくつかの利点には、失敗したタスクの自動再試行、および実行中のタスクの最大期間の設定が含まれます。

これには別の依存関係が含まれますが、その制限なしで一部の読者に役立つ可能性があります。

于 2014-12-17T19:22:34.510 に答える