def ncustom_zip(seq1,seq2,max_length):
length= len(seq1) if len(seq1)>len(seq2) else len(seq2) if max_length else len(seq1) if len(seq1)<len(seq2) else len(seq2)
for i in range(length):
x= seq1[i] if len(seq1)>i else None
y= seq2[i] if len(seq2)>i else None
yield x,y
l=[12,2,3,9]
p=[89,8,92,5,7]
for i,j in ncustom_zip(l,p,True):
print i,j
for i,j in ncustom_zip(l,p,False):
print i,j
Одно из решений, которое я использовал, состоит в том, чтобы сделать это:
1) Создать пользовательскую команду управления , например.
python manage.py my_cool_command
2) Используйте cron
(в Linux) или at
(в Windows) для запуска моей команды в требуемые моменты времени.
Это простое решение, которое не требует установки тяжелого стека AMQP. Однако есть хорошие преимущества в использовании чего-то типа сельдерея, упомянутого в других ответах. В частности, с Celery неплохо не распространять логику приложения в файлы crontab. Однако решение cron работает довольно хорошо для приложения малого и среднего размера и где вы не хотите много внешних зависимостей.
EDIT:
В более поздней версии окон at
устарела для Windows 8, Server 2012 и выше. Вы можете использовать schtasks.exe
для такого же использования.
Хотя он не является частью Django, Airflow - это более новый проект (начиная с 2016 года), который полезен для управления задачами.
Airflow - это система автоматизации и планирования рабочего процесса, которая может использоваться для создания и управления конвейерами данных. Веб-интерфейс предоставляет разработчику ряд опций для управления и просмотра этих конвейеров.
Airflow написан на Python и построен с использованием Flask.
Airflow был создан Maxime Beauchemin at Airbnb и открылся весной 2015 года. Он присоединился к инкубационной программе Apache Software Foundation зимой 2016 года. Здесь представлена страница проекта Git и некоторая дополнительная информация .
Интересное новое подключаемое приложение Django: django-chronograph
Вам нужно добавить только одну запись cron, которая действует как таймер, и у вас очень приятный интерфейс администратора Django сценарии для запуска.
У нас есть open-source, что я считаю структурированным приложением. что решение Брайана выше намека.
https://github.com/tivix/django-cron
Он поставляется с одной командой управления:
./manage.py runcrons
Это делает работу. Каждый cron моделируется как класс (так что все OO), и каждый cron работает на другой частоте, и мы убеждаемся, что тот же тип cron не работает параллельно (в случае, если самим кронам требуется больше времени для работы, чем их частота!)
Спасибо!
Лично я использую cron, но интересны расписания работы частей django-extensions .
Более современным решением (по сравнению с Celery) является Django Q: https://django-q.readthedocs.io/en/latest/index.html
It имеет отличную документацию и легко разбирается. Отсутствует поддержка Windows, поскольку Windows не поддерживает процесс форсинга. Но он отлично работает, если вы создаете среду разработки с помощью подсистемы Windows для Linux.
Сегодня у меня было что-то похожее на вашу проблему.
Я не хотел, чтобы он обрабатывался сервером trhough cron (и большинство из них были просто помощниками cron в конце).
Итак, я создал модуль планирования и привязал его к init.
Это не лучший подход, но он помогает мне иметь весь код в одном месте и с его исполнением связанные с основным приложением.
Предложение Брайана Нила о выполнении команд управления через cron работает хорошо, но если вы ищете что-то немного более надежное (но не так тщательно, как Celery), я бы посмотрел в библиотеку, например Kronos :
# app/cron.py
import kronos
@kronos.register('0 * * * *')
def task():
pass
Я не уверен, что это будет полезно для всех, так как я должен был предоставить другим пользователям системы расписание заданий, не предоставляя им доступ к фактическому планировщику планировщика (Windows), я создал это многоразовое приложение.
Обратите внимание, что пользователи имеют доступ к одной общей папке на сервере, где они могут создать требуемый файл command / task / .bat. Эта задача затем может быть запланирована с помощью этого приложения.
Имя приложения - Django_Windows_Scheduler
В верхней части вашего файла cron.py введите следующее:
#!/usr/bin/python
import os, sys
sys.path.append('/path/to/') # the parent directory of the project
sys.path.append('/path/to/project') # these lines only needed if not on path
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproj.settings'
# imports and code below
Я просто подумал об этом довольно простом решении:
Вы можете добавлять параметры, но просто добавлять параметры к URL.
Расскажите, что вы думаете.
[Обновить] Я теперь использую команду runjob из django-extensions вместо curl.
Мой cron выглядит примерно так:
@hourly python /path/to/project/manage.py runjobs hourly
... и так и ежедневно, ежемесячно и т. д. ». Вы также можете настроить его для выполнения определенного задания.
Я считаю его более управляемым и более чистым. Не требует сопоставления URL-адреса для представления. Просто определите свой класс работы и crontab, и вы настроены.
Да, метод выше настолько велик. И я попробовал некоторые из них. Наконец, я нашел такой метод:
from threading import Timer
def sync():
do something...
sync_timer = Timer(self.interval, sync, ())
sync_timer.start()
Точно так же, как рекурсивный.
Хорошо, я надеюсь, что этот метод может удовлетворить ваши требования. :) [/ Д2]
Я использую сельдерей для создания своих периодических задач. Сначала вам нужно установить его следующим образом:
pip install django-celery
Не забудьте зарегистрировать django-celery
в своих настройках, а затем вы можете сделать что-то вроде этого:
from celery import task
from celery.decorators import periodic_task
from celery.task.schedules import crontab
from celery.utils.log import get_task_logger
@periodic_task(run_every=crontab(minute="0", hour="23"))
def do_every_midnight():
#your code
Некоторое время назад у меня было точно такое же требование, и я решил его решить, используя APScheduler ( Руководство пользователя )
простой и сохраняет его независимым от запроса на основе некоторого кода. Ниже приведен простой пример, который я использовал в своем коде.
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
job = None
def tick():
print('One tick!')\
def start_job():
global job
job = scheduler.add_job(tick, 'interval', seconds=3600)
try:
scheduler.start()
except:
pass
Надеюсь, это поможет кому-то!
Вы должны обязательно проверить django-q! Это не требует дополнительной настройки и, возможно, все, что необходимо для решения любых производственных проблем в коммерческих проектах.
Он активно развивается и очень хорошо интегрируется с django, django ORM, mongo, redis. Вот моя конфигурация:
# django-q
# -------------------------------------------------------------------------
# See: http://django-q.readthedocs.io/en/latest/configure.html
Q_CLUSTER = {
# Match recommended settings from docs.
'name': 'DjangoORM',
'workers': 4,
'queue_limit': 50,
'bulk': 10,
'orm': 'default',
# Custom Settings
# ---------------
# Limit the amount of successful tasks saved to Django.
'save_limit': 10000,
# See https://github.com/Koed00/django-q/issues/110.
'catch_up': False,
# Number of seconds a worker can spend on a task before it's terminated.
'timeout': 60 * 5,
# Number of seconds a broker will wait for a cluster to finish a task before presenting it again. This needs to be
# longer than `timeout`, otherwise the same task will be processed multiple times.
'retry': 60 * 6,
# Whether to force all async() calls to be run with sync=True (making them synchronous).
'sync': False,
# Redirect worker exceptions directly to Sentry error reporter.
'error_reporter': {
'sentry': RAVEN_CONFIG,
},
}
RabbitMQ и Celery имеют больше возможностей и возможностей обработки задач, чем Cron. Если сбой задачи не является проблемой, и вы считаете, что будете обрабатывать сломанные задачи при следующем вызове, тогда Cron будет достаточным.
Celery & amp; AMQP позволит вам обрабатывать сломанную задачу, и она снова будет выполнена другим работником (работники Celery будут слушать следующую задачу для работы) до тех пор, пока не будет достигнут атрибут max_retries
задачи. Вы можете даже вызывать задачи при сбое, например, протоколировать сбой, или отправлять электронное письмо администратору после достижения max_retries
.
И вы можете распространять серверы Celery и AMQP, когда вам нужно масштабировать применение.
Если вы хотите что-то более надежное, чем Celery , попробуйте TaskHawk, который построен поверх AWS SQS / SNS.
Посмотрите на Django Poor Man's Cron, который является приложением Django, которое использует спам-роботы, роботы с индексированием поисковых систем и аналогичные для регулярного выполнения запланированных заданий
Сельдерей - это распределенная очередь задач, построенная на AMQP (RabbitMQ). Он также обрабатывает периодические задачи в виде cron-like (см. периодические задания ). В зависимости от вашего приложения это может стоить gander.
Сельдерей довольно легко настроить с помощью django ( docs ), а периодические задания фактически пропустят пропущенные задачи в случае время простоя. Сельдерей также имеет встроенные механизмы повтора, в случае неудачи задачи.
после части кода, я могу написать что угодно, как мои view.py:)
#######################################
import os,sys
sys.path.append('/home/administrator/development/store')
os.environ['DJANGO_SETTINGS_MODULE']='store.settings'
from django.core.management impor setup_environ
from store import settings
setup_environ(settings)
#######################################
из http://www.cotellese.net/2007/09/27 / обкатка внешние скрипты-против-Джанго-модели /
Если вы используете стандартную ОС POSIX, вы используете cron .
Если вы используете Windows, вы используете в .
Напишите команду управления Django для