Créez un lot planifié simple à l'aide de l'image Python de Docker et de parse-crontab

Cet article est le 14ème jour du Docker Advent Calendar 2015.

Summary

Sujet principal

Cette histoire est tirée de la session de discussion PyCon JP 2015 "[Baseball Hack! ~ Analyse et visualisation de données avec Python](http://www.slideshare.net/shinyorke/hackpython-pyconjp" Baseball Hack! ~ Données utilisant Python Ceci est un extrait et une version explicative détaillée de l'histoire "J'ai fait un lot pour acquérir des données de baseball avec Docker et parse-crontab!" Cela a été montré dans la seconde moitié de "Analysis and Visualization") ".

Fondamentalement, il y a beaucoup de parties que j'écris pour ma commodité et mes pensées, alors j'attends votre avis Proposition Tsukkomi m (_ _) m

Aussi, en fabriquant ce matériau,

** Implémentation du traitement d'exécution programmée en Python (GAUJIN.JP/Gojin) **

J'ai fait référence à l'entrée ci-dessus.

Qui êtes vous

Auto-introduction

Histoire de Dockar

Contexte

[Annonce du XP Festival 2015] avant PyCon JP 2015 ,,, [http://www.slideshare.net/shinyorke/agile-baseball-science-52692504 "Science du baseball agile - Science du baseball agile qui fonctionne bien pour le cerveau Hanashi ") avait besoin de données sur le baseball et a commencé le développement.

Tâche

L'image Docker Hub Python n'inclut pas crontab

tournant! ~ Crontab peut-il fonctionner uniquement avec Python?

Je venais de faire une annonce pour PyCon JP 2015, alors j'ai demandé sur Twitter de "le réimprimer!" → Merci pour votre aimable consentement.

échantillon et commentaire

Le code du baseball est un peu compliqué (et je ne veux pas trop en expliquer), alors j'ai fait un échantillon.

python-crontab-docker-example(GitHub)

L'environnement recommandé est Python 3.4.x ou supérieur.

Au fait, cela fonctionne bien avec la dernière version Python 3.5.1 pour le moment (2015/12/14)!

Définition et exécution du travail

Définissez un JobController qui exécute le lot et les JobSettings qui gèrent la prochaine heure d'exécution et l'intervalle jusqu'à l'exécution.

L'argument de JobController.run () est le paramètre crontab familier (* * * * *).

scheduler/job.py


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

import time
import functools
import logging
from crontab import CronTab
from datetime import datetime, timedelta
import math

__author__ = 'Shinichi Nakagawa'


class JobController(object):
    """
Contrôleur d'exécution des travaux
    """

    @classmethod
    def run(cls, crontab):
        """
Exécution du traitement
        :param crontab: job schedule
        """
        def receive_func(job):
            @functools.wraps(job)
            def wrapper():

                job_settings = JobSettings(CronTab(crontab))
                logging.info("->- Process Start")
                while True:
                    try:
                        logging.info(
                            "-?- next running\tschedule:%s" %
                            job_settings.schedule().strftime("%Y-%m-%d %H:%M:%S")
                        )
                        time.sleep(job_settings.interval())
                        logging.info("->- Job Start")
                        job()
                        logging.info("-<- Job Done")
                    except KeyboardInterrupt:
                        break
                logging.info("-<- Process Done.")
            return wrapper
        return receive_func


class JobSettings(object):
    """
Paramètres de sortie
    """

    def __init__(self, crontab):
        """
        :param crontab: crontab.CronTab
        """
        self._crontab = crontab

    def schedule(self):
        """
Prochaine exécution
        :return: datetime
        """
        crontab = self._crontab
        return datetime.now() + timedelta(seconds=math.ceil(crontab.next()))

    def interval(self):
        """
Heure de la prochaine exécution
        :return: seconds
        """
        crontab = self._crontab
        return math.ceil(crontab.next())

corps de lot

Importez JobController, regroupez le processus à exécuter et exécutez-le en parallèle.

L'échantillon est réalisé tous les vendredis soirs au Tamori Club et tous les jours à 18h00 comme l'enseignement du baseball.

Comme un point à noter

C'est à peu près ça.

batch.py


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

import logging
from multiprocessing import Pool
from scheduler.job import JobController

__author__ = 'Shinichi Nakagawa'


#Notez que le fuseau horaire de Docker Image est UTC!
@JobController.run("20 15 * * 5")
def notice_tmr_club():
    """
Il est temps pour Tamori Club(Tokyo)
    :return: None
    """
    logging.info("Le Tamori Club va commencer! !! !!")


#Notez que le fuseau horaire de Docker Image est UTC!(Je l'ai dit deux fois parce que c'est important)
@JobController.run("00 9 * * *")
def notice_baseball():
    """
Enseigner le temps de Yakiu
    :return: None
    """
    logging.info("Il est temps de partir! !! !! !!")


def main():
    """
méthode pour exécuter crontab
    :return: None
    """
    #Paramètres du journal(Niveau d'information, format, horodatage)
    logging.basicConfig(
        level=logging.INFO,
        format="time:%(asctime)s.%(msecs)03d\tprocess:%(process)d" + "\tmessage:%(message)s",
        datefmt="%Y-%m-%d %H:%M:%S"
    )

    #Enregistrez la tâche que vous souhaitez exécuter avec crontab
    jobs = [notice_tmr_club, notice_baseball]

    # multi process running
    p = Pool(len(jobs))
    try:
        for job in jobs:
            p.apply_async(job)
        p.close()
        p.join()
    except KeyboardInterrupt:
        logging.info("exit")


if __name__ == '__main__':
    main()

Dockerfile

C'est simple.

Incluez le code GitHub, lancez et quittez.

Dockerfile


# Python crontab sample

FROM python:3.5.1

MAINTAINER Shinichi Nakagawa <[email protected]>

# add to application
RUN mkdir /app
WORKDIR /app
ADD requirements.txt /app/
RUN pip install -r requirements.txt
ADD ./scheduler /app/scheduler/
ADD *.py /app/

docker-compose

Écrivez les paramètres de démarrage du docker dans docker-compose.yml.

Cependant, déplacez batch.py et terminez.

docker-compose.yml


batch:
  build: .
  dockerfile: ./Dockerfile
  command: python batch.py
  container_name: python_crontab_example

Commencez! !! !!

Si vous composez un docker (ou exécutez un docker) et que vous vous déplacez comme ça, c'est OK.

$ docker-compose up
Creating python_crontab_example
Attaching to python_crontab_example
python_crontab_example | time:2015-12-13 13:45:09.463   process:9       message:->- Process Start
python_crontab_example | time:2015-12-13 13:45:09.464   process:8       message:->- Process Start
python_crontab_example | time:2015-12-13 13:45:09.465   process:9       message:-?- next running        schedule:2015-12-18 15:20:00
python_crontab_example | time:2015-12-13 13:45:09.465   process:8       message:-?- next running        schedule:2015-12-14 09:00:00

Résumé et à la personne suivante

Résumé

Au suivant

Merci @tamai.

Recommended Posts

Créez un lot planifié simple à l'aide de l'image Python de Docker et de parse-crontab
[Python] Créer un environnement Batch à l'aide d'AWS-CDK
Créer une carte Web en utilisant Python et GDAL
Créer une interface graphique python à l'aide de tkinter
Créez une image factice avec Python + PIL.
Créer une application GUI simple en Python
[Python] Créez un linebot pour écrire le nom et l'âge sur l'image
J'ai créé un exemple pour accéder à Salesforce en utilisant Python et Bottle
Créer un modèle d'investissement dynamique simple en Python
Créez un fichier MIDI en Python en utilisant pretty_midi
Créer en Python sans fichier image factice dans Django et tester le téléchargement de l'image
Créons un système de réception simple avec le framework sans serveur Python Chalice et Twilio
Créer un bot de collecte de données en Python à l'aide de Selenium
Créez un capteur de couleur à l'aide d'une tarte à la râpe et d'une caméra
Essayez de créer un fichier compressé en utilisant Python et zlib
Créer un module Python
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 1 ~
Créez un fichier image à l'aide de PIL (Python Imaging Library).
[Python] Générer ValueObject avec un constructeur complet à l'aide de classes de données
Essayez de créer un jeu simple avec Python 3 et iPhone
Créer une image à plage dynamique élevée (HDR) avec OpenCV et Python (Mertens, Robertson, Debevec)
Créez un lot d'images et gonflez avec ImageDataGenerator
Implémentation d'un générateur en utilisant Python> link> yield et next ()> yield
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 2 ~
[Python] Masquez l'image dans un cercle à l'aide de Pillow
Créer un environnement Python
Créez un environnement shell et python décent sur Windows
Créez une API simple juste pour entrer et sortir des fichiers JSON ~ Édition Python / Flask ~
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 3 ~
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 4 ~
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 5 ~
[Python] Démarrez un fichier de commandes à partir de Python et passez des variables.
Je souhaite créer une source sonore de karaoké en séparant les instruments et les voix en utilisant Python
Construire un environnement Python sur un Mac, jusqu'au point d'utiliser Jupyter Lab
[Python] Créer une liste de dates et d'heures pour une période spécifiée
[Python] Chapitre 01-03 À propos de Python (Ecrire et exécuter un programme à l'aide de PyCharm)
Créons un diagramme PRML avec Python, Numpy et matplotlib.
[Python Kivy] Comment créer une simple fenêtre pop-up
Créez le code qui renvoie "A et prétendant B" en python
Créez un outil d'analyse vidéo simple avec python wxpython + openCV
Créez un environnement de développement Python simple avec VSCode et Docker Desktop
Python: créer un dictionnaire à partir d'une liste de clés et de valeurs
Créer une instance GCE à partir d'une image Docker GCR à l'aide de terraform
Utilisez wxpython pour créer une fenêtre de type d'image d'arrière-plan transparent semblable à un gadget
Tirez en accéléré à partir d'une caméra PC en utilisant Python, OpenCV
Créez une application CRUD simple en utilisant la vue de classe générique de Django
[Python] Accès et recadrage des pixels d'image à l'aide d'OpenCV (pour les débutants)
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python
Créer un plugin Wox (Python)
Créer une fonction en Python
Créer un dictionnaire en Python
Créer un serveur REST (simple)
# 1 [python3] Calcul simple à l'aide de variables
Créer des tickets JIRA en utilisant Python
Créer un tableau numpy python
Créer un serveur textlint simple
Créer un répertoire avec python
J'ai fait un circuit simple avec Python (AND, OR, NOR, etc.)