Хранилище тут половина дела. Вторая половина в том, что происходит с задачей, которую взяли в работу и не довели до конца.
Смотри, как оно ломается: скрипт выбрал задачу, проставил vzyato=1, пошёл выполнять и словил kill посреди сетевого запроса. Задача навсегда осталась взятой и никем не сделанной, в выборку она больше не попадёт. Поэтому вместо флага пишут срок аренды.
UPDATE zadachi
SET vzyato = strftime('%s','now') + 300
WHERE id = ? AND vzyato < strftime('%s','now');
Взял задачу, у тебя пять минут. Не уложился или умер, аренда истекла, задачу подхватит следующий заход. Долгие задачи продлевают аренду по ходу работы, каждые пару минут.
Отсюда вытекает главное: любая задача может выполниться дважды. Значит писать её надо безопасной к повтору. У меня выгрузка идёт во временный файл и переезжает на место через rename, повтор просто перезапишет то же самое содержимое.
tmp = put + ".tmp"
with open(tmp, "w") as f:
f.write(vygruzka)
os.replace(tmp, put)