Сохранить очередь Python в файл - PullRequest
2 голосов
/ 04 августа 2011

Я использую класс Python Queue для управления списком задач, которые совместно используются несколькими рабочими потоками.Фактический код огромен, и я все еще делаю его полностью без ошибок.Время от времени рабочие потоки вылетают, и мне приходится перезапускать всю процедуру.В процессе я теряю все задачи, которые были поставлены в очередь.Есть ли способ сохранить очередь в файл, чтобы при каждом перезапуске процесса список задач предварительно загружался из этого файла?

На первый взгляд кажется, что когда я получаю или помещаю задачи в очередь,должно быть чтение и запись в файл одновременно.Однако это не дает мне функциональности queue.task_done () и может быть не самым оптимальным решением.Любые идеи будут с благодарностью.

Ответы [ 5 ]

5 голосов
/ 04 августа 2011

Рассматривали ли вы просто засорение очереди ?

1 голос
/ 04 августа 2011

Существует несколько подходов к этому, в том числе модуль pickle ...

Но, на мой взгляд, было бы проще просто записать в файл, строку за строкой, каждый элемент очереди встолбцы, содержащие другие свойства, которые вы можете сохранить, например, пример task_done.

:

element1, True
element2, False
...

В python очень просто читать файл, отформатированный следующим образом:

for line in file('path/file.ext'):
    name, state = line.split(sep_char)
    #and them insert into the queue...
0 голосов
/ 07 сентября 2011

Реализация механизма квитирования между рабочим и мастером.

У мастера есть список задач, прежде чем поместить их в очередь, протолкнуть список в файл. Затем вставьте задачу в очередь. Когда работник закончил, он отправляет обратно сообщение ACK. Только в этот момент откройте список задач и удалите соответствующий идентификатор.

0 голосов
/ 07 сентября 2011

Простой вариант, который я могу предложить, - обернуть таблицу базы данных в класс и использовать ее в качестве своей очереди.Столбец с автоинкрементом будет творить чудеса (следующий элемент, который нужно удалить, это элемент с наименьшим идентификатором).

class dbQueue:
  init():
    # Pick some random id for this run (or set it to some thing you know).
  put():
    # Insert entry into table
  get():
    # The update .. select combo removes the need for a database that has transactions.
    # If no entries bear your ID:
      # Update the next entry that is not already marked with your ID.
    # Select the entry that matches your ID and return it.
  task_done():
    # Delete the entry with your ID.

Это не будет иметь наилучшую производительность в зависимости от того, как часто обновляется очередьдаже база данных sqlite в памяти не будет такой же быстрой, как структура связанного списка.С другой стороны, вы можете просматривать базу данных с помощью любого инструмента, который может получить доступ к базе данных, поэтому вы можете видеть, какой из них находится в процессе.

0 голосов
/ 10 августа 2011

Самый простой способ сделать это - использовать AMQP для очередей сообщений и позволить брокеру сообщений позаботиться о них. Я реализовал аналогичную систему, используя RabbitMQ в качестве посредника сообщений с устойчивыми постоянными очередями. Сообщения даже пережили сбой серверного программного обеспечения RabbitMQ, когда я использовал устаревшую версию сервера 1.72 на виртуальном сервере Linux с только 512 МБ ОЗУ и около миллиона сообщений в игре.

То, как я это делаю, заключается в том, что каждый тип работника получает сообщения из другой очереди. Если мне требуется более одного работника этого типа, то очередь сообщений автоматически переходит в циклический режим, и если работник не может завершить обработку сообщения, он просто не подтверждает его, и он возвращается в очередь.

Я написал небольшой модуль shim с примерно 80 строками кода, чтобы он стоял перед kombu, а позже переписал его, чтобы использовать py-amqplib. Если бы я знал о haigha ранее, я бы использовал это, так как это очень близко соответствует документу спецификаций AMQP.

Я не рекомендую kombu, потому что он настолько сложен для отладки и странным образом отличается от стандарта AMQP. Взгляните на haigha, потому что, хотя документация представляет собой не более одного примера фрагмента кода на PyPi, она лучше документирована, чем либо kombu, либо amqplib, потому что вы можете использовать спецификации AMQP в качестве документа haigha.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...