私はPythonとDjangoの新機能ですので、これを行うより良い方法があれば教えてください。私がしようとしているのは、各Device(models.Modelから継承)が長時間実行されているバックグラウンドスレッドを起動して、そのデバイスの正常性を常にチェックすることです。しかし、私のコードを実行すると、デーモンのように実行されているようには見えません。サーバーは遅くて絶えずタイムアウトしています。このバックグラウンドスレッドは(ほとんどの場合)プログラムの寿命を延ばします。以下は Djangoモデルで長時間実行されているバックグラウンドスレッド
は、私のコードの簡易版である:class Device(models.Model):
active = models.BooleanField(default=True)
is_healthy = models.BooleanField(default=True)
last_heartbeat = models.DateTimeField(null=True, blank=True)
def __init__(self, *args, **kwargs):
super(Device, self).__init__(*args, **kwargs)
# start daemon thread that polls device's health
thread = Thread(name='device_health_checker', target=self.health_checker())
thread.daemon = True
thread.start()
def health_checker(self):
while self.active:
if self.last_heartbeat is not None:
time_since_last_heartbeat = timezone.now() - self.last_heartbeat
self.is_healthy = False if time_since_last_heartbeat.total_seconds() >= 60 else True
self.save()
time.sleep(10)
これは、スレッドの非常に単純な使用のように思えるが、私は解決策を検索するたびに、提案されたアプローチはにやり過ぎのように思えるセロリを使用することです私。セロリのようなものを必要とせずにこれを動作させる方法はありますか?
テーブルにはいくつのデバイスのエントリが存在しますか?デバイスのステータスを確認する必要がある時間間隔はどのくらいにする必要がありますか? –
これは私のアプリケーションだった場合は、[カスタム管理コマンド](https://docs.djangoproject.com/en/1.11/howto/custom-management-commands/)をcronにするか、[セロリ]でタスクをスケジュールしますhttp://www.celeryproject.org/) – danihp
新しい 'Device'インスタンスが初期化されるたびに新しいバックグラウンドスレッドを開始しています。デバイスを照会するたびに、返されるデバイスごとに新しいスレッドが作成されます。これにより、何百ものスレッドではなくても、数多くのスレッドが迅速に作成されます。これにより、サーバーが停止し、Webページを処理するスレッドからリソースが取り除かれます。私はちょうどセロリを使用し、適切にそれを言うと思います。 – knbk