Запустите скрипт Python как сервис с Twisted - PullRequest
0 голосов
/ 03 мая 2019

Я хотел бы запустить этот скрипт как автоматический сервис, который будет запускаться каждую минуту, каждый день с Twisted (я сначала попытался «DAEMON», но это кажется трудным, и я не нашел хороших tutos для этого, я уже попробовал crontab но это не то что я ищу).

Кто-нибудь когда-нибудь делал это с Twisted, потому что я не нашел учебник, созданный для моего вида сценария (получение данных из таблицы БД и помещение их в другую таблицу того же БД)? Я должен хранить журналы в файле, но это не будет самой сложной частью.

    from twisted.enterprise import adbapi
from twisted.internet import task
import logging
from datetime import datetime
from twisted.internet import reactor
from twisted.internet.defer import inlineCallbacks


"""
Test DB : This File do database connection and basic operation.
"""

log = logging.getLogger("Test DB")

dbpool = adbapi.ConnectionPool("MySQLdb",db="xxxx",user="guza",passwd="vQsx7gbblal8aiICbTKP",host="192.168.15.01")


class MetersCount():

    def getTime(self):
        log.info("Get Current Time from System.")
        time = str(datetime.now()).split('.')[0]
        return time

    def getTotalMeters(self):
        log.info("Select operation in Database.")
        getMetersQuery = """ SELECT count(met_id) as totalMeters FROM meters WHERE DATE(met_last_heard) = DATE(NOW()) """

        return dbpool.runQuery(getMetersQuery).addCallback(self.getResult)

    def getResult(self, result):
        print ("Receive Result : ")
        print (result)
        # general purpose method to receive result from defer.
        return result

    def insertMetersCount(self, meters_count):
        log.info("Insert operation in Database.")
        insertMetersQuery = """ INSERT INTO meter_count (mec_datetime, mec_count)  VALUES (NOW(), %s)"""
        return dbpool.runQuery(insertMetersQuery, [meters_count])

    def checkDB(self):
        d = self.getTotalMeters()
        d.addCallback(self.insertMetersCount)
        return d

a= MetersCount()
a.checkDB()
reactor.run()

1 Ответ

0 голосов
/ 08 мая 2019

Если вы хотите запускать функцию раз в минуту, взгляните на LoopingCall . Он берет функцию и запускает ее с интервалами, если не сказано, чтобы остановить.

Вы бы использовали что-то вроде этого (которое я не проверял):

from twisted.internet.task import LoopingCall
looper = LoopingCall(a.checkDB)
looper.start(60)

Документация находится по ссылке.

...