Editing Twisted

From JaWiki (Jabber/XMPP wiki)
Jump to: navigation, search

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=[http://twistedmatrix.com/ twistedmatrix.com]
+
|        language=[[Python]]
|        language={{Lang|l|Python}}
+
}}[[Category:Python]][[Category:Python_Library]]
|        xmlparser=внутренний (twisted.words.xish)
+
<!--        Реализация стандартов  -->
+
|          roster=нет
+
<!-- |    filetransfer=пересылка файлов -->
+
|        dataforms=нет
+
|            disco=нет
+
|            adhoc=нет
+
|              zip=нет
+
|          pubsub=нет
+
|              pep=нет
+
|          jingle=нет
+
|              jid=да
+
|            sasl=да
+
|        component=да
+
}}
+
  
'''Twisted'''&nbsp;— фрэймворк для написания сетевых приложений на [[Python]].
+
'''Twisted''' -- framework для написания сетевых приложений.  
Предоставляет механизмы для легкой реализации сетевого сервера и клиента.
+
Предоставляет механизмы для легкой реализации сетевого сервера и клиента.  
Есть классы облегчающие реализацию своего протокола, а также уже реализована обработка большого числа существующих протоколов, в том числе и XML-потока [[Jabber]]-а.
+
Есть классы облегчающие реализацию своего протокола, а также уже реализована обработка большого числа существующих протоколов, в том числе и XML-потока [[Jabber]]-а.  
  
Но работа Twisted не ограничивается только сетью.
+
Но работа Twisted не ограничивается только сетью.  
 
Этот фреймворк облегчает создание расширяемых с помощью плагинов программ, конструирование многосервисных программ, создание единой авторизации пользователей между сервисами и многое другое.
 
Этот фреймворк облегчает создание расширяемых с помощью плагинов программ, конструирование многосервисных программ, создание единой авторизации пользователей между сервисами и многое другое.
  
Работа с [[XMPP]] реализована в модуле <code>twisted.words</code>, который, кроме того, поддерживает {{proto|lib|IRC}}, {{proto|lib|MSN}} (MSNP8, полуэкспериментальная поддержка) и {{proto|lib|OSCAR}}.
 
  
 
== Для начинающего Twisted-разработчика ==
 
== Для начинающего Twisted-разработчика ==
В отличие от многих других [[библиотека|библиотек]] и фреймворков для реализации Jabber-приложений, в Twisted обработка нескольких клиентских соединений производится не через потоки или процессы, а через {{w|конечный автомат}}. Это означает, что всех клиентов обслуживает, грубо говоря, ''один поток и один цикл'', а вся ответственность за «параллелизацию» работы c клиентами ложится на плечи программиста, а не ОС. Такой подход признан более эффективным, но и более сложным в исполнении.
+
В отличии от многих других [[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)
  
К счастью, вся сложная часть уже реализована в Twisted, а программисту остается только создавать свои обработчики событий и придерживаться нескольких правил:
+
== Для Jabber разработчика ==
# Функция не должна долго думать. Так как все соединения обрабатываются в одном потоке и в одном цикле, то каждая пауза сказывается на всех. Поэтому «долгие» задачи (большие вычисления и&nbsp;т.&nbsp;п.) должны быть выделены в отдельный поток, который в конце работы вернет результат с помощью вызова функции в общем цикле (создание потока и возврат результата можно облегчить с помощью <code>twisted.internet.threads.deferToThread</code>).
+
Реализация Jabber протокола находится в пакете twisted.words.protocols.jabber.  
# Вся работа с внешними и потенциально-тормознутыми данными, а это базы данных, сеть и даже работа с файлами, по тем же причинам должна быть разделена на две части (обычно через объект Deferred): первая отправляет запрос, вторая (callback) обрабатывает результат, когда он появится. Для такой работы с большой частью тормознутых объектов уже подготовлены нужные классы.
+
{{Todo|про создание и отправку станз}}
# Вся работа с сетью осуществляется в небезопасном, с точки зрения потоков, режиме. Поэтому для отправки в сеть каких-либо данных из потока (если вы все же решили выделить отдельный) необходимо воспользоваться специальными функциями, которые вставят отправку в общий цикл (<code>reactor.callFromThread</code>). То же касается и других вещей, которые в многопоточной программе требовали блокировок.
+
 
+
== Для Jabber-разработчика ==
+
Реализация Jabber протокола находится в пакете <code>twisted.words.protocols.jabber</code>.
+
{{Todo|про создание и отправку стансов}}
+
 
{{Todo|про создание обработчиков}}
 
{{Todo|про создание обработчиков}}
  
 
=== Пример клиентского приложения ===
 
=== Пример клиентского приложения ===
Пример простого бота для Jabber-сервера ([http://yoan.dosimple.ch/blog/2007/01/30/ источник], адаптирован для работы с Twisted 2.5.0)
+
{{Todo|перевести http://yoan.dosimple.ch/blog/2007/01/30/}}
  
# Эти модули понадобятся.
+
== Ссылки ==
from twisted.words.protocols.jabber import client, jid, xmlstream
+
[[:Category:Twisted]]
from twisted.words.xish import domish
+
from twisted.internet import reactor
+
+
# Для JID-а используем специальный Twisted-класс
+
me = jid.JID("greutly@swissjabber.ch/TwistedWords")
+
+
# Так как бот -- это клиентское приложение, то и factory (см. [http://twistedmatrix.com/projects/core/documentation/howto/glossary.html#Factory глоссарий])
+
# тоже будет клиентским. Модуль twisted.words.protocols.jabber.client
+
# предоставляет класс для создания factory Jabber-клиентов.
+
factory = client.basicClientFactory(me, "password")
+
+
# FSM полностью строится на callback-ах. Ждать нельзя. Поэтому писать
+
# что-то вроде "открыть сокет, подождать ответ, послать логин/пароль,
+
# подождать и т.д." тоже нельзя. Для того, чтобы выполнить какие-то
+
# определенные действия после авторизации, необходимо создать callback:
+
def authd(xmlstream):
+
    # создание XML элемента presence.
+
    presence = domish.Element(('jabber:client', 'presence'))
+
    presence.addElement('status').addContent('Online')
+
 
+
    # отправка в xmlstream. Обратите внимание, что это безопасная отправка,
+
    # так как эта функция вызывалась из главного цикла и в данный момент мы
+
    # единственные, кто сейчас работает с потоком. Остальные, если есть, ждут.
+
    xmlstream.send(presence)
+
 
+
    # Установка обработчика на входящие XML-элементы message. Первый
+
    # параметр -- это XPath
+
    xmlstream.addObserver('/message', gotMessage)
+
+
# сам обработчик. параметр message -- XML-элемент
+
# основная функция обработчика -- печатать то, что
+
# пришло.
+
def gotMessage(message):
+
    # sorry for the str(), makes unicode happy
+
    print u"from: %s" % message["from"]
+
    for e in message.elements():
+
        if e.name == "body":
+
            print unicode(str(e))
+
            break
+
+
# Теперь регистрация callback-а authd.
+
factory.addBootstrap(xmlstream.STREAM_AUTHD_EVENT, authd)
+
+
# И последнее:
+
# Создание главного реактора для клиентского TCP соединения
+
reactor.connectTCP("swissjabber.ch", 5222, factory)
+
# Запуск реактора
+
reactor.run()
+
  
== Ссылки ==
+
== См. также ==
 
* [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://twistedmatrix.com/projects/core/documentation/howto/tutorial/index.html пример реализации протоколо Finger с помощью Twisted]
* [http://twistedmatrix.com/projects/core/documentation/howto/tutorial/index.html Пример реализации] протокола {{w|Finger}} с помощью Twisted
+

Please note that all contributions to JaWiki (Jabber/XMPP wiki) may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see JaWiki (Jabber/XMPP wiki):Copyrights for details). Do not submit copyrighted work without permission!

Cancel | Editing help (opens in new window)