Автор открыл для себя то, что в асинхронном приложении тоже бывают проблемы с конкурентным доступом, и хотел этим поделиться. Ну и DeferredLock он тоже для себя открыл, написав вначале штуки 2 вариаций «на тему».
Насколько я понимаю, всё описанное не работает, если запускать несколько копий приложения, а так нередко делают, чтобы нагрузить равномерно многоядерную систему. Как быть в таком случае?
ну твистед позволит наиболее полно загрузить одно ядро, так что если нету реально необходимости параллелить (например когда большую часть времени мы ждем ответы), то лучше не параллелить.
ну а если надо — делается аналогичная реализация на базе хотя бы memcached или flock. даже сам класс придется не сильно много переписывать
d.addCallback(power,a) читать как d.addCallback(multiply, a)?
ну и еще бы хорошо добавить d.addCallbacks(release_pool, release_pool), а то релиз походу не вызывается во втором примере
ну и d = some_service.do_long_boring_call(a) — этот вызов же скорее всего должен вернуть Deferred, иначе смысл использовать лок? в таком случае в multiply попадет не результат, а всего лишь Deferred.
п.с. ничего личного, но с твистедом и так местами непонятно, что произошло, так что примеры без адекватной обработки ошибок и содержащие ошибки могут еще больше запутать понимание
> Так что общий совет — работая с twisted — больше читайте исходники, там спрятаны велосипеды на все случаи жизни.
Это уж точно.
Один из основных минусов твистеда — крайне скудная документация. Без регулярного копания в кишках использовать его в полную силу несколько затруднительно.
Конкурентность в асинхронном приложении на примере twisted