>  기사  >  백엔드 개발  >  Database_python을 정기적으로 수정하기 위한 Python 샘플 코드

Database_python을 정기적으로 수정하기 위한 Python 샘플 코드

不言
不言원래의
2018-04-08 10:42:291777검색

이 글에서는 Python에서 정기적으로 데이터베이스를 수정하기 위한 샘플 코드를 주로 소개합니다. 편집자가 꽤 좋다고 생각해서 지금 공유하고 참고용으로 올려드리겠습니다. 편집기를 따라가며 데이터베이스를 정기적으로 수정해야 할 경우 일반적으로 데이터베이스를 수정하기 위해 예약된 프로세스를 시작하도록 선택합니다. 이런 예약된 작업을 비즈니스에 적고 인터페이스로 작성한다면 예약된 프로세스가 좀 부적절해 보이죠? 정기적으로 데이터베이스를 100번 수정해야 한다면 기존 방법은 100개의 프로세스를 시작하게 됩니다. 이 프로세스는 매우 가볍지만 여전히 불편합니다. 실제로 threading.Timer를 사용하여 해당 스레드를 생성하여 라이브러리 수정 작업을 수행할 수 있으며 아이디어는 비교적 간단합니다.

1. 데이터베이스 수정 작업이 수행되는 시간인 update_time을 전달하고, update_time과 현재 시간 사이의 빼기 방법을 사용하여 데이터베이스 수정 작업까지의 time_delay를 가져옵니다. 두 표준 시간 형식 문자열 간의 시간 차이를 찾으려면 datetime.datetime.strptime()을 사용하여 시간 형식을 지정할 수 있으며, 형식화된 시간을 직접 뺄 수 있으며 .seconds()를 실행하여 결과를 초로 변환할 수 있습니다.

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()이 스레드에서 실행되어야 합니다. 변경사항이 적용됩니다.

Timer를 사용하는 이 예약 실행 방법은 기존 예약 프로세스보다 가볍고 간단하지만 분명한 단점도 있습니다. 서비스가 종료되면 모든 타이밍 스레드가 기본 프로세스와 함께 삭제됩니다. 모든 스레드가 성공적으로 실행되기 위한 전제 조건은 서비스가 안정적이어야 하고 다시 시작할 수 없다는 것입니다. 서비스를 다시 시작하려면 완료되지 않은 작업(예: 데이터베이스에 쓰기)을 디스크에 쓴 다음 이전에 완료되지 않은 작업을 읽고 서비스를 시작할 때 타이밍 스레드를 다시 만드는 방법을 찾아야 합니다.

관련 권장 사항:

Python



에서 파일 읽기 및 쓰기에 대한 자세한 설명

위 내용은 Database_python을 정기적으로 수정하기 위한 Python 샘플 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.