У меня простая проблема. Я должен получить URL (примерно раз в минуту), проверить, есть ли новый контент, и, если есть, опубликовать его на другой URL.
У меня есть рабочая система с cronjob каждую минуту, которая в основном:
for link in models.Link.objects.filter(enabled=True).select_related():
# do it in two phases in case there is cross pollination
# get posts
twitter_posts, meme_posts = [], []
if link.direction == "t2m" or link.direction == "both":
twitter_posts = utils.get_twitter_posts(link)
if link.direction == "m2t" or link.direction == "both":
meme_posts = utils.get_meme_posts(link)
# process them
if len(twitter_posts) > 0:
post_count += views.twitter_link(link, twitter_posts)
if len(meme_posts) > 0:
post_count += views.meme_link(link, meme_posts)
count += 1
msg = "%s links crawled and %s posts updated" % (count, post_count)
Это прекрасно работает для 150 пользователей, которые у меня сейчас есть, но синхронность этого пугает меня. У меня есть встроенные тайм-ауты URL, но в какой-то момент мой cronjob займет> 1 минуту, и у меня останется миллион из них, выполняющих перезапись друг друга.
Итак, как мне это переписать?
Некоторые проблемы:
- Я не хочу слишком сильно бить по API, если они меня блокируют. Поэтому я хотел бы иметь максимум 5 открытых соединений с любым API в любое время.
- Пользователи продолжают регистрироваться в системе, пока это выполняется, поэтому мне нужно как-то добавить их
- Я бы хотел, чтобы это масштабировалось как можно лучше
- Я бы хотел использовать как можно больше существующего кода
Итак, некоторые мысли у меня были:
- Создать поток для каждого
link
- Использовать Python-Twisted - Оставить один запущенный процесс, который cronjob просто гарантирует, что работает.
- Использовать без стеков - Не особо много знаю об этом.
- Ask StackOverflow:)
Как бы вы это сделали?