ホームページ  >  記事  >  バックエンド開発  >  定期的にdatabase_pythonを変更するためのPythonサンプルコード

定期的にdatabase_pythonを変更するためのPythonサンプルコード

不言
不言オリジナル
2018-04-08 10:42:291776ブラウズ

この記事では主にPythonでデータベースを定期的に変更するためのサンプルコードを紹介していますが、編集者が非常に良いと思ったので、参考として共有させていただきます。エディターに従って、データベースを定期的に変更する必要がある場合は、通常、データベースを変更するためのスケジュールされたプロセスを開始することを選択します。この種のスケジュールされたタスクをビジネスに書き込んでインターフェイスとして記述すると、スケジュールされたプロセスは少し不適切に見えますか?データベースを定期的に 100 回変更する必要がある場合、従来の方法では 100 個のプロセスが起動されますが、このプロセスは非常に軽量ですが、それでも不快に感じます。実際、threading.Timer を使用して、ライブラリ変更操作を実行するための対応するスレッドを作成できます。その考え方は比較的単純です。

1. データベース変更操作が実行される時刻である update_time を渡し、update_time と現在時刻の間の減算メソッドを使用して、データベース変更操作までの time_lay を取得します。 2 つの標準時刻書式文字列間の時刻の差を見つけるには、datetime.datetime.strptime() を使用して時刻を書式設定できます。書式設定された時刻を直接減算し、.秒() を実行することで結果を秒に変換できます。

2. ライブラリ変更操作を update() メソッドにカプセル化し、threading.Timer によって作成されたスレッドに更新と時刻の差を渡します。使用方法は threading.Timer(interval, function, args=[], kwargs=) です。 {}) でスレッド インスタンスを作成します。間隔は実行を遅らせる時間です。単位は秒です。その後、start() が実行されます。タイマーはノンブロッキングであり、相互に影響を与えることなく複数のスレッドを作成できます。

コードは以下の通りです

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from model import Table
from handler.base_handler import BaseHandler
from threading import Timer
import datetime


class TimeHandler(BaseHandler):
  def do_action(self):
    update_time = "2018-04-07 18:00:00"
    ads_id = "test_1"
    t_online = datetime.datetime.strptime(update_time, '%Y-%m-%d %H:%M:%S')
    now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    t_now = datetime.datetime.strptime(now, '%Y-%m-%d %H:%M:%S')
    time_delay = (t_online - t_now).seconds
    t1 = Timer(time_delay, self.update, (ads_id, ))
    t1.start()
    self.result = "success"
    return

  def update(self, ads_id):
    self.db.dsp.query(Table).filter(Table.ads_id == ads_id).update({Table.is_del: 0})
    self.db.dsp.commit()


update_timeをフロントエンドから渡されるパラメータに変更することで、その時点でデータベース変更操作を実行することができます。そのとき、最後の行に commit() が追加されていなかったため、データベース変更操作が有効にならないという小さな落とし穴に遭遇しました。本来、ライブラリを変更するコミットは基本クラス BaseHandler に記述されて有効になりますが、ここでの update() は Timer スレッドで実行され、非同期操作である Commit() をスレッド内で実行する必要があります。変更が有効になります。

タイマーを使用して実行のタイミングを計るこの方法は、従来のタイミング プロセスよりも軽くて簡単ですが、明らかな欠点もあります。サービスがシャットダウンされると、すべてのタイミング スレッドがメイン プロセスとともに破棄されます。すべてのスレッドが正常に実行されるための前提条件は、サービスが安定していて再起動できないことです。サービスを再起動する場合は、未完了のタスクをディスクに書き込む方法 (データベースへの書き込みなど) を見つけてから、サービスの開始時に以前に未完了のタスクを読み取り、タイミング スレッドを再作成する必要があります。

関連する推奨事項:

Python でのファイルの読み取りと書き込みに関する詳細な説明



以上が定期的にdatabase_pythonを変更するためのPythonサンプルコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。