Erstellen Sie einen einfachen geplanten Stapel mit Dockers Python Image und parse-crontab

Dieser Artikel ist der 14. Tag von Docker Adventskalender 2015.

Summary

Hauptthema

Diese Geschichte stammt aus der PyCon JP 2015 Talk Session "[Baseball Hack! ~ Datenanalyse und -visualisierung mit Python](http://www.slideshare.net/shinyorke/hackpython-pyconjp" Baseball Hack! ~ Daten mit Python Dies ist ein Auszug und eine detaillierte Erklärungsversion der Geschichte "Ich habe einen Stapel erstellt, um Baseballdaten mit Docker und Parse-Crontab zu erfassen!", Die in der zweiten Hälfte von "Analyse und Visualisierung" gezeigt wurde.

Grundsätzlich gibt es viele Teile, die ich für meine Bequemlichkeit und Gedanken schreibe, also warte ich auf Ihre Meinung Tsukkomi Vorschlag m (_ _) m

Auch bei der Herstellung dieses Materials,

** Implementieren der geplanten Ausführungsverarbeitung in Python (GAUJIN.JP/Gojin) **

Ich habe auf den obigen Eintrag verwiesen.

Wer bist du

Vorstellen

Dockar-Geschichte

Hintergrund

[Ankündigung des XP Festivals 2015] vor PyCon JP 2015 ,,, [http://www.slideshare.net/shinyorke/agile-baseball-science-52692504 "Agile Baseball-Wissenschaft - Agile Baseball-Wissenschaft, die gut für das Gehirn funktioniert Hanashi ") brauchte Baseballdaten und begann mit der Entwicklung.

Aufgabe

Das Docker Hub Python-Image enthält kein Crontab

Wendepunkt! ~ Kann crontab nur mit Python arbeiten?

Ich habe gerade eine Ankündigung für PyCon JP 2015 gemacht und auf Twitter gebeten, sie erneut zu drucken. → Vielen Dank für Ihre freundliche Zustimmung.

Probe & Kommentar

Der Baseball-Code ist etwas kompliziert (und ich möchte nicht zu viel erklären), deshalb habe ich ein Beispiel gemacht.

python-crontab-docker-example(GitHub)

Die empfohlene Umgebung ist Python 3.4.x oder höher.

Übrigens funktioniert es momentan mit der neuesten Version Python 3.5.1 (14.12.2015) einwandfrei!

Jobeinstellung & Ausführung

Definieren Sie einen JobController, der Batch ausführt, und JobSettings, die die nächste Ausführungszeit und das nächste Ausführungsintervall bis zur Ausführung verwalten.

Das Argument von JobController.run () ist die bekannte Crontab-Einstellung (* * * * *).

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):
    """
Jobausführungscontroller
    """

    @classmethod
    def run(cls, crontab):
        """
Ausführung verarbeiten
        :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):
    """
Ausgabeeinstellungen
    """

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

    def schedule(self):
        """
Nächster Lauf
        :return: datetime
        """
        crontab = self._crontab
        return datetime.now() + timedelta(seconds=math.ceil(crontab.next()))

    def interval(self):
        """
Zeit bis zur nächsten Ausführung
        :return: seconds
        """
        crontab = self._crontab
        return math.ceil(crontab.next())

Chargenkörper

Importieren Sie JobController, bündeln Sie den auszuführenden Prozess und führen Sie ihn parallel aus.

Die Probe wird jeden Freitagabend im Tamori Club und jeden Tag um 18:00 Uhr gemacht, um Baseball zu unterrichten.

Als Punkt zu beachten

Das ist alles.

batch.py


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

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

__author__ = 'Shinichi Nakagawa'


#Beachten Sie, dass die Zeitzone von Docker Image UTC ist!
@JobController.run("20 15 * * 5")
def notice_tmr_club():
    """
Es ist Zeit für den Tamori Club(Tokio)
    :return: None
    """
    logging.info("Der Tamori Club startet! !! !!")


#Beachten Sie, dass die Zeitzone von Docker Image UTC ist!(Ich habe es zweimal gesagt, weil es wichtig ist)
@JobController.run("00 9 * * *")
def notice_baseball():
    """
Lehre die Zeit von Yakiu
    :return: None
    """
    logging.info("Es ist Zeit zu gehen! !! !! !!")


def main():
    """
Methode zum Ausführen von crontab
    :return: None
    """
    #Protokolleinstellungen(Info-Level, Format, Zeitstempel)
    logging.basicConfig(
        level=logging.INFO,
        format="time:%(asctime)s.%(msecs)03d\tprocess:%(process)d" + "\tmessage:%(message)s",
        datefmt="%Y-%m-%d %H:%M:%S"
    )

    #Registrieren Sie den Job, den Sie mit crontab ausführen möchten
    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

Das ist einfach.

Fügen Sie den GitHub-Code ein, starten und beenden Sie ihn.

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

Schreiben Sie die Docker-Starteinstellungen in docker-compose.yml.

Verschieben Sie jedoch batch.py und beenden Sie den Vorgang.

docker-compose.yml


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

Anlaufen! !! !!

Wenn Sie Docker-Compose erstellen (oder Docker ausführen) und sich so bewegen, ist dies in Ordnung.

$ 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

Zusammenfassung & zur nächsten Person

Zusammenfassung

Zum nächsten

Vielen Dank, dass Sie @tamai.

Recommended Posts

Erstellen Sie einen einfachen geplanten Stapel mit Dockers Python Image und parse-crontab
[Python] Erstellen Sie eine Stapelumgebung mit AWS-CDK
Erstellen Sie eine Webmap mit Python und GDAL
Erstellen Sie mit tkinter eine Python-GUI
Erstellen Sie mit Python + PIL ein Dummy-Image.
Erstellen Sie eine einfache GUI-App in Python
[Python] Erstellen Sie einen Linebot, um den Namen und das Alter auf das Bild zu schreiben
Ich habe ein Beispiel für den Zugriff auf Salesforce mit Python und Bottle erstellt
Erstellen Sie in Python ein einfaches Momentum-Investmentmodell
Erstellen Sie eine MIDI-Datei in Python mit pretty_midi
Testen Sie das Hochladen von Bildern, indem Sie in Python erstellen, ohne Dummy-Bilddateien in Django zu platzieren
Erstellen wir ein einfaches Empfangssystem mit dem serverlosen Python-Framework Chalice und Twilio
Erstellen Sie mit Selenium einen Datenerfassungsbot in Python
Erstellen Sie einen Farbsensor mit einem Raspeltorte und einer Kamera
Versuchen Sie, eine komprimierte Datei mit Python und zlib zu erstellen
Erstellen Sie ein Python-Modul
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 1 ~
Erstellen Sie eine Bilddatei mit PIL (Python Imaging Library).
[Python] Generieren Sie ValueObject mit dem vollständigen Konstruktor mithilfe von Datenklassen
Versuchen Sie, ein einfaches Spiel mit Python 3 und iPhone zu erstellen
Erstellen Sie mit OpenCV und Python (Mertens, Robertson, Debevec) ein High Dynamic Range Image (HDR).
Erstellen Sie einen Stapel von Bildern und blasen Sie sie mit ImageDataGenerator auf
Implementieren eines Generators mit Python> Link> Yield und next ()> Yield
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 2 ~
[Python] Maskiere das Bild mit Pillow zu einem Kreis
Erstellen Sie eine Python-Umgebung
Erstellen Sie unter Windows eine anständige Shell- und Python-Umgebung
Erstellen Sie eine einfache API, um JSON-Dateien einzugeben und auszugeben ~ Python / Flask Edition ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 3 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 4 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 5 ~
[Python] Starten Sie eine Batchdatei aus Python und übergeben Sie Variablen.
Ich möchte eine Karaoke-Klangquelle erstellen, indem ich Instrumente und Gesang mit Python trenne
Erstellen einer Python-Umgebung auf einem Mac bis zur Verwendung von Jupyter Lab
[Python] Erstellen Sie eine Datums- und Zeitliste für einen bestimmten Zeitraum
[Python] Kapitel 01-03 Über Python (Schreiben und Ausführen eines Programms mit PyCharm)
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
[Python Kivy] So erstellen Sie ein einfaches Popup-Fenster
Erstellen Sie den Code, der in Python "A und vorgeben B" ausgibt
Erstellen Sie mit python wxpython + openCV ein einfaches Videoanalysetool
Erstellen Sie mit VSCode & Docker Desktop eine einfache Python-Entwicklungsumgebung
Python: Erstellen Sie ein Wörterbuch aus einer Liste von Schlüsseln und Werten
Erstellen Sie eine GCE-Instanz aus einem GCR Docker-Image mithilfe von Terraform
Verwenden Sie wxpython, um ein Gadget-ähnliches transparentes Hintergrundbildfenster zu erstellen
Nehmen Sie Zeitraffer von einer PC-Kamera mit Python, OpenCV auf
Erstellen Sie eine einfache CRUD-App mit der generischen Klassenansicht von Django
[Python] Zugreifen auf und Zuschneiden von Bildpixeln mit OpenCV (für Anfänger)
Ich habe Chatbot mit LINE Messaging API und Python erstellt
Erstellen Sie ein Wox-Plugin (Python)
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
Erstellen Sie einen (einfachen) REST-Server
# 1 [python3] Einfache Berechnung mit Variablen
Erstellen Sie JIRA-Tickets mit Python
Erstellen Sie ein Python-Numpy-Array
Erstellen Sie einen einfachen Textlint-Server
Erstellen Sie ein Verzeichnis mit Python
Ich habe eine einfache Schaltung mit Python gemacht (AND, OR, NOR, etc.)