Сегодня утром читая ленту разработчиков Twisted, обратил внимание на интересный проект. Админка слегка напоминает Django. Сразу подумал о потенциальной мощности подобного приложения. Нужно протестировать на своем asus wl500gpv2.
Этот проект поддерживает автоматическую закачку через RSS, импорт и переименование скаченных файлов в медиа библиотеку. Автор говорит, что это идеальное решение для домашних серверов.
Лицензия GPLv2
Введение
Сообщество разработчиков Twisted открыто ведет процесс разработки и документирует его. Это позволяет взглянуть на работу профессионалов и позаимствовать базу знаний.
Разработка через тестирование (Test driven development/TDD)
Twisted имеет модуль для тестирования кода(unit tests).
Он называется Trial.
Посмотрев примеры кода самого twisted, мы наверняка найдем схожую
с нашей задачей проблему, которая была решена ранее. Так мы можем найти
примеры тестов для протоколов. Такие тесты используются в проекте FATS.
Немного о технике TDD:
-
Мы создаем код теста и пишем в нем пустые методы для нашего кода.
-
Нашего кода не существует! Мы ставим себе задачу для его реализации.
-
Запускаем Trial. Видим что у нас все горит, — ничего не работает.
-
Начинаем выполнять эти пункты! Таким образом мы сразу тестируем свой код и планируем работы.
Постановка задачи
В качестве примера буду использовать два реализованных проекта:
-
FATS — Быстрые телефонные сервисы на базе программной IP-PBX Asterisk
-
DBSync — синхронизатор баз данных в режиме 24/7/365
В первую очередь важно понять необходимость использования Twisted. Как уже говорилось ранее: “есть множество способов решить задачу”.
Deferred \ Callbacks \ Errbacks
Не блокирующий запрос web страницы:
from twisted.web.client import getPage
from twisted.internet import reactor
def lowerCaseContents(contents):
return contents.lower()
def printContents(contents):
print contents
reactor.stop()
deferred = getPage('http://twistedmatrix.com/')
# Добавляем два callback'а для запроса web страницы
# первый преобразует весь полученный текст к нижнему регистру
# второй распечатает ответ запроса в стандартный поток вывода
deferred.addCallback(lowerCaseContents)
deferred.addCallback(printContents)
reactor.run()
Проблема
Внутри сервисов возникают задачи обработки множества запросов
или\и распараллеливания задач для увеличения быстродействия.
На такие вычисления уходит время, причиной может служить следующие ситуации:
-
Интенсивные вычисления, например вычисление простых чисел. Большой расход ресурсов компьютера и процессорного времени в частности. (Многие сталкивались с такими задачами только в школе)
-
Ожидании данных необходимых для расчета конечных результатов программы. (Некоторые также сталкивались с такими задачами в школе. Ждали пока за них решат задачу другие.)
ПАиПП — Практика Асинхронного и Параллельного Программирования
Буду писать ряд статей по данной тематике. Давно уже собирался.
Планирую затронуть несколько тем:
-
Общее видение
-
Взгляд изнутри
-
Классические примеры
-
Практика в рабочих проектах
-
Постановка задачи
-
Проектирование Шаблоны проектирования
-
Техника разработки (TDD)
-
Управление пакетами (Release management)
-
Документирование проекта
В качестве примера буду использовать код самого Twisted, Fats, DBsync(только теоретически), немного затрону Zope3.
Скоро выложу презентацию в удобоваримом виде, она была частично представлена на конференции Exception #07.
Ну вот и дождались, долго разработчики тянули кота за яйца и наконец то выпустили официальный релиз Twisted.
Сегодня Radix объявил о предварительном выпуске версии Twisted 8.0.
Честно говоря я не совсем понял что повлияло на такой номер версии.
Из того что мне удалось узнать на данный момент, могу сказать следующее:
1) Проделана большая работа Кристофером Армстронгом(Радикс) Автоматизация контроля версий. О части этой системы хотел рассказать в докладе на Ex07, но не успел =(.