Szukam biblioteki w Pythonie, który zapewni at
i cron
jak funkcjonalność.
Wolałbym mieć czyste rozwiązanie Python, zamiast polegać na narzędziach zainstalowanych w pudełku; w ten sposób uruchamiam na maszynach bez crona.
Dla tych, którzy nie są zaznajomieni z cron
: możesz zaplanować zadania w oparciu o wyrażenie takie jak:
0 2 * * 7 /usr/bin/run-backup # run the backups at 0200 on Every Sunday
0 9-17/2 * * 1-5 /usr/bin/purge-temps # run the purge temps command, every 2 hours between 9am and 5pm on Mondays to Fridays.
Składnia wyrażenia czasu cron jest mniej ważna, ale chciałbym mieć coś z taką elastycznością.
Jeśli nie ma czegoś, co zrobiłoby to dla mnie natychmiast po wyjęciu z pudełka, wszelkie sugestie dotyczące elementów konstrukcyjnych, aby stworzyć coś takiego, byłyby z wdzięcznością przyjęte.
Edycja Nie jestem zainteresowany uruchamianiem procesów, tylko „zadania” napisane również w funkcjach Pythona. Z konieczności uważam, że byłby to inny wątek, ale nie w innym procesie.
W tym celu szukam ekspresji wyrażenia czasu cron, ale w Pythonie.
Cron istnieje od lat, ale staram się być jak najbardziej przenośny. Nie mogę polegać na jego obecności.
źródło
Odpowiedzi:
Jeśli szukasz lekkiego harmonogramu realizacji transakcji :
Ujawnienie : Jestem autorem tej biblioteki.
źródło
schedule
. To działało dla mnie dobrze. Byłoby jeszcze ładniej, gdyby miał cron podobny do składni i obsługiwanych dekoratorów (patrz crython, ale nie używaj tej biblioteki, ponieważ nie działa; harmonogram nie wydaje się być dobrze napisany).do()
Funkcja przekazuje dodatkowe argumenty, które przekazujesz do funkcji zadania: schedule.readthedocs.io/en/stable/api.html#schedule.Job.do Na przykład możesz to zrobić :schedule.every().hour.do(job, param1, param2)
Nie trzeba używać lambda. Mam nadzieję, że to pomoże :)Możesz po prostu użyć normalnej składni przekazywania argumentów w języku Python, aby określić tabelę crontab. Załóżmy na przykład, że definiujemy klasę Event jak poniżej:
(Uwaga: Nie gruntownie przetestowane)
Następnie tablicę CronTab można określić w normalnej składni Pythona jako:
W ten sposób zyskujesz pełną moc mechaniki argumentów Pythona (mieszanie argumentów pozycyjnych i słów kluczowych, i możesz używać nazw symbolicznych dla nazw tygodni i miesięcy)
Klasa CronTab zostałaby zdefiniowana jako po prostu spanie w przyrostach minutowych i wywoływanie check () dla każdego zdarzenia. (Prawdopodobnie są pewne subtelności z czasem letnim / strefami czasowymi, o których należy pamiętać). Oto szybka implementacja:
Należy zwrócić uwagę na kilka rzeczy: dni tygodnia / miesiące Pythona są indeksowane przez zero (w przeciwieństwie do crona), a zakres ten wyklucza ostatni element, stąd składnia taka jak „1-5” staje się zakresem (0,5) - tj. [0,1,2, 3,4]. Jeśli wolisz składnię crona, parsowanie nie powinno być jednak zbyt trudne.
źródło
pip install anything
:)może pojawiło się to dopiero po zadaniu pytania; Pomyślałem, że wspomnę o tym wyłącznie ze względu na kompletność: https://apscheduler.readthedocs.org/en/latest/
źródło
Jedną z rzeczy, które widziałem podczas moich poszukiwań, jest
sched
moduł Pythona, który może być tym, czego szukasz.źródło
„... Moduł Crontab do odczytu i zapisu plików crontab oraz automatycznego dostępu do systemowego crona za pomocą bezpośredniego interfejsu API.”
http://pypi.python.org/pypi/python-crontab
a także APScheduler, pakiet python. Już napisane i debugowane.
http://packages.python.org/APScheduler/cronschedule.html
źródło
Mniej więcej tak samo jak powyżej, ale jednocześnie używa gevent :)
źródło
Żadne z wymienionych rozwiązań nie próbuje nawet przeanalizować złożonego ciągu harmonogramu cron. Oto moja wersja, używając cronitera . Podstawowa treść:
Procedury pomocnicze:
źródło
elif
? Atm używam harmonogramu, takiego jak"* * * * *"
dodawanietime.sleep
dłuższych niż 1 minuta w „Rób swoje okresowe rzeczy”if
, ale zawsze widzę te rzeczy w instrukcji if. Gdy zajmuje to więcej niż 1 minutę, po prostu widzę, jak pętla while pomija wykonanie brakującej pętli.Zmodyfikowałem skrypt.
Łatwy w użyciu:
Spróbuj rozpocząć zadanie w pierwszej sekundzie minuty.
Kod na Github
źródło
Mam drobną poprawkę do metody uruchamiania klasy CronTab zasugerowanej przez Briana .
Czas upłynął o jedną sekundę, co doprowadziło do jednosekundowej, twardej pętli pod koniec każdej minuty.
źródło
Nie ma na to sposobu „czystego Pythona”, ponieważ jakiś inny proces musiałby uruchomić Pythona, aby uruchomić twoje rozwiązanie. Każda platforma będzie miała jeden lub dwadzieścia różnych sposobów uruchamiania procesów i monitorowania ich postępów. Na platformach unix cron jest starym standardem. W systemie Mac OS X uruchomiono również aplikację, która łączy uruchamianie typu cron z funkcją watchdog, która może utrzymać proces przy życiu, jeśli tego chcesz. Po uruchomieniu Pythona możesz użyć modułu harmonogramu do planowania zadań.
źródło
Wiem, że jest wiele odpowiedzi, ale innym rozwiązaniem może być dekorator . To jest przykład powtarzania funkcji codziennie o określonej godzinie. Fajnym pomysłem na używanie w ten sposób jest to, że wystarczy dodać cukier syntaktyczny do funkcji, którą chcesz zaplanować:
A dekorator będzie wyglądał następująco:
źródło
Rozwiązanie Briana działa całkiem dobrze. Jednak, jak zauważyli inni, w kodzie uruchamiania występuje subtelny błąd. Również uznałem, że jest to zbyt skomplikowane dla potrzeb.
Oto moja prostsza i funkcjonalna alternatywa dla kodu uruchamiania na wypadek, gdyby ktoś go potrzebował:
źródło
Innym trywialnym rozwiązaniem byłoby:
I klasa aqcron. Jest to:
źródło
Jeśli szukasz rozproszonego harmonogramu, możesz sprawdzić https://github.com/sherinkurian/mani - to wymaga redis, ale może nie być tym, czego szukasz. (zauważ, że jestem autorem) został on zbudowany w celu zapewnienia odporności na awarie, ponieważ zegar działa na więcej niż jednym węźle.
źródło
Nie wiem, czy coś takiego już istnieje. Łatwo byłoby napisać własny moduł czasu, godziny i / lub kalendarza, patrz http://docs.python.org/library/time.html
Jedynym problemem dla Pythona rozwiązania jest to, że potrzebuje pracy, aby być zawsze działa i może być automatycznie „wskrzeszony” po restarcie, coś dla którego zrobić konieczność powoływania się na rozwiązaniach systemowych zależnych.
źródło
Możesz sprawdzić [1] Crons PiClouda [2], ale pamiętaj, że twoje zadania nie będą działały na twoim komputerze. Jest to również usługa, za którą musisz zapłacić, jeśli korzystasz z ponad 20 godzin obliczeniowych miesięcznie.
[1] http://www.picloud.com
[2] http://docs.picloud.com/cron.html
źródło
Metoda Crontab na serwerze.
Nazwa pliku Python hello.py
Krok 1: Utwórz plik sh, podając nazwę s.sh
Krok 2: Otwórz Edytor Crontab
Krok 3: Dodaj harmonogram
Użyj formatowania Crontab
Ten cron będzie działał „W minucie 2.”
źródło
Podoba mi się, jak pakiet Pycron rozwiązuje ten problem.
źródło