Используете pickle для «транзакции» в памяти? - PullRequest
1 голос
/ 13 февраля 2011

Пользователь может выполнить действие, которое может вызвать зависимые действия (которые сами могут иметь зависимые действия), и я хочу иметь возможность отменить все это, если пользователь отменяет зависимое действие.

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

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

Кто-нибудь пробовал это?Есть какие-нибудь ошибки, за которыми нужно следить?Любая причина не делать этого?

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

Ответы [ 2 ]

1 голос
/ 13 февраля 2011

Вы можете использовать pickle для сохранения вашего состояния, если все элементы состояния являются сериализуемыми (обычно это так).Единственные причины этого не делать:

  • если вам нужно хранить указатели на любые объекты, которые не сохранены в состоянии, у вас будут проблемы с этими указателями после выполнения операции отмены.

  • этот метод может быть дорогим, в зависимости от размера вашего состояния.

Также вы можете использовать zip (), чтобы уменьшить использование памяти в обмен наповышение загрузки процессора.

1 голос
/ 13 февраля 2011

Ну, как вы упомянули, дизайн данных слабо связан, так что вы, я не думаю, что вам нужно выбирать его, если он находится в памяти.Просто возьмите копию всех соответствующих переменных, и transaction.abort() просто скопирует их обратно, а transaction.commit() затем просто удалит копию данных.

Есть проблемы, но ни одна из них не решена.с рассолом.

...