Editing Twisted
From JaWiki (Jabber/XMPP wiki)
Warning: The database has been locked for maintenance, so you will not be able to save your edits right now. You may wish to copy and paste your text into a text file and save it for later.
The administrator who locked it offered this explanation: MediaWiki upgrading
The edit can be undone.
Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
{{Library | {{Library | ||
| name=Twisted | | name=Twisted | ||
− | + | | url=http://twistedmatrix.com/trac/ | |
− | | url= | + | | language=[[Python]] |
− | | language= | + | }}[[Category:Python]][[Category:Python_Library]] |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | }} | + | |
− | '''Twisted''' | + | '''Twisted''' -- framework для написания сетевых приложений. |
− | Предоставляет механизмы для легкой реализации сетевого сервера и клиента. | + | Предоставляет механизмы для легкой реализации сетевого сервера и клиента. |
− | Есть классы облегчающие реализацию своего протокола, а также уже реализована обработка большого числа существующих протоколов, в том числе и XML-потока [[Jabber]]-а. | + | Есть классы облегчающие реализацию своего протокола, а также уже реализована обработка большого числа существующих протоколов, в том числе и XML-потока [[Jabber]]-а. |
− | Но работа Twisted не ограничивается только сетью. | + | Но работа Twisted не ограничивается только сетью. |
Этот фреймворк облегчает создание расширяемых с помощью плагинов программ, конструирование многосервисных программ, создание единой авторизации пользователей между сервисами и многое другое. | Этот фреймворк облегчает создание расширяемых с помощью плагинов программ, конструирование многосервисных программ, создание единой авторизации пользователей между сервисами и многое другое. | ||
− | |||
== Для начинающего Twisted-разработчика == | == Для начинающего Twisted-разработчика == | ||
− | В | + | В отличии от многих других [[Library|библиотек]] и фреймворков для реализации Jabber-приложений, в twisted-e обработка нескольких клиентских соединений производится не через потоки или процессы, а через конечный автомат ([http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82 FSM]). |
+ | Это заставляет при написании приложения придерживаться нескольких правил: | ||
+ | # Функция не должна долго думать. Так как практически все соединения обрабатываются в одном потоке и в одном цикле, то каждая пауза сказывается на всех. Поэтому "долгие" задачи должны быть выделены в отдельный поток, который в конце работы передаст результат с помощью вызова функции в общем цикле (например с помощью twisted.internet.threads.deferToThread). | ||
+ | # Вся работа с внешними и потенциально-тормознутыми данными, это базы данных, сеть и даже работа с файлами, по тем же причинам должна быть разделена на две части (обычно через объект Deferred): | ||
+ | ## Первая отправляет запрос | ||
+ | ## Вторая (callback) обрабатывает результат когда он появится. | ||
+ | # Вся работа с сетью осуществляется в небезопасном, с точки зрения потоков, режиме. Поэтому для отправки в сеть каких-либо данных из потока необходимо воспользоваться специальными функциями, которые вставят отправку в общий цикл (reactor.callFromThread) | ||
− | + | == Для Jabber разработчика == | |
− | + | Реализация Jabber протокола находится в пакете twisted.words.protocols.jabber. | |
− | + | {{Todo|про создание и отправку станз}} | |
− | + | ||
− | + | ||
− | == Для Jabber | + | |
− | Реализация Jabber протокола находится в пакете | + | |
− | {{Todo|про создание и отправку | + | |
{{Todo|про создание обработчиков}} | {{Todo|про создание обработчиков}} | ||
=== Пример клиентского приложения === | === Пример клиентского приложения === | ||
Пример простого бота для Jabber-сервера ([http://yoan.dosimple.ch/blog/2007/01/30/ источник], адаптирован для работы с Twisted 2.5.0) | Пример простого бота для Jabber-сервера ([http://yoan.dosimple.ch/blog/2007/01/30/ источник], адаптирован для работы с Twisted 2.5.0) | ||
+ | |||
# Эти модули понадобятся. | # Эти модули понадобятся. | ||
Line 53: | Line 39: | ||
me = jid.JID("greutly@swissjabber.ch/TwistedWords") | me = jid.JID("greutly@swissjabber.ch/TwistedWords") | ||
− | # Так как бот -- это клиентское приложение, то и factory (см | + | # Так как бот -- это клиентское приложение, то и factory (см [http://twistedmatrix.com/projects/core/documentation/howto/glossary.html#Factory глоссарий]) |
− | # тоже будет клиентским. | + | # тоже будет клиентским. Библиотека twisted.words.protocols.jabber.client |
# предоставляет класс для создания factory Jabber-клиентов. | # предоставляет класс для создания factory Jabber-клиентов. | ||
factory = client.basicClientFactory(me, "password") | factory = client.basicClientFactory(me, "password") | ||
Line 80: | Line 66: | ||
# пришло. | # пришло. | ||
def gotMessage(message): | def gotMessage(message): | ||
− | # sorry for the | + | # sorry for the __str__(), makes unicode happy |
print u"from: %s" % message["from"] | print u"from: %s" % message["from"] | ||
for e in message.elements(): | for e in message.elements(): | ||
if e.name == "body": | if e.name == "body": | ||
− | print unicode | + | print unicode(e.__str__()) |
break | break | ||
Line 97: | Line 83: | ||
== Ссылки == | == Ссылки == | ||
+ | [[:Category:Twisted]] | ||
+ | |||
+ | == См. также == | ||
* [http://www.opennet.ru/base/dev/server_way.txt.html Подходы к организации серверного приложения] | * [http://www.opennet.ru/base/dev/server_way.txt.html Подходы к организации серверного приложения] | ||
* [http://twistedmatrix.com/documents/current/api/ Twisted API] | * [http://twistedmatrix.com/documents/current/api/ Twisted API] | ||
− | * [http://twistedmatrix.com/projects/core/documentation/howto/index.html | + | * [http://twistedmatrix.com/projects/core/documentation/howto/index.html Twisted документация] |
* [http://ru.pywiki.com/index.php/Twisted Twisted на русскоязычной Python wiki] | * [http://ru.pywiki.com/index.php/Twisted Twisted на русскоязычной Python wiki] | ||
− | * [http://twistedmatrix.com/projects/core/documentation/howto/tutorial/index.html | + | * [http://twistedmatrix.com/projects/core/documentation/howto/tutorial/index.html пример реализации протоколо Finger с помощью Twisted] |