Djangoで数分ごとにSQLiteデータベースにデータを入力する必要がありますが、データベースを更新するためにデータが利用可能になるまで、古いデータを提供したいと思います。 (つまり、収集するデータをブロックしたくない。のみブロックできるのは、データベースにロックがある場合で、その間は選択の余地がない。)
また、別のプログラムやライブラリをインストールしたくありません。
スレッドの問題に遭遇することなく、多数のモデルでsave()
を呼び出すことができる別のスレッドを設定するにはどうすればよいですか?
本格的なタスク管理システムではなく、バックグラウンドで処理を実行するだけの軽量ソリューションを探している場合は、 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のインストールでさえ多すぎる場合は、単純に ダウンロード して、プロジェクトにいくつかの必要なファイルを含めることができます。
セロリ 。
Celeryは、分散メッセージパッシングに基づく非同期タスクキュー/ジョブキューです。リアルタイム操作に重点を置いていますが、スケジューリングもサポートしています。
CeleryはPythonで記述されていますが、プロトコルは任意の言語で実装できます。また、Webhookを使用して他の言語で動作することもできます。
John Lehmannの回答の簡単な更新:Django-background-taskは維持されておらず、新しいDjangoバージョンと互換性がありません。しばらく前に新しい機能で更新および拡張し、新しい下位互換性のあるパッケージを維持しましたon Github 。新しい Django-background-tasks アプリは、PyPIからダウンロードまたはインストールできます。
読者の観点からアトミックに見えるように更新が必要かどうかによって異なります。古いデータと新しいデータを一緒に表示してもかまわない場合は、データを入力する カスタム管理コマンド を作成し、 cron から数分ごとに実行します。
アトミックに見えるようにする必要がある場合は、すべての書き込みを1つにラップする SQLiteトランザクション 経由 Django.db.transaction おそらく、必要なロックを提供するはずです。
Djangoバックグラウンドタスク は、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')
あなたはまだそれらのタスクをスケジュールする何かが必要ですが。いくつかの利点には、失敗したタスクの自動再試行、および実行中のタスクの最大期間の設定が含まれます。
これには別の依存関係が含まれますが、その制限がない一部の読者には役立つ可能性があります。
私は同じ問題を抱えていましたが、問題を解決するためにセロリのようなサービスを実行したくありませんでした。
Linuxシステムでposix_spawnを見つけました。完全なDjango環境で実行されるmanage.pyコマンドを作成できます。これらのコマンドは、このプロジェクトのバックグラウンドで実行できます。
実行中にデータをWebサイトに戻す必要がある場合は、memcachedを使用します。