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)
+
Пример простого бота для Jabber-сервера ([http://yoan.dosimple.ch/blog/2007/01/30/ источник])
  
 
  # Эти модули понадобятся.
 
  # Эти модули понадобятся.
  from twisted.words.protocols.jabber import client, jid, xmlstream
+
  from twisted.words.protocols.jabber import client, jid
  from twisted.words.xish import domish
+
  from twisted.xish import domish, xmlstream
 
  from twisted.internet import reactor
 
  from twisted.internet import reactor
 
   
 
   
Line 53: Line 38:
 
  me = jid.JID("greutly@swissjabber.ch/TwistedWords")
 
  me = jid.JID("greutly@swissjabber.ch/TwistedWords")
 
   
 
   
  # Так как бот -- это клиентское приложение, то и factory (см. [http://twistedmatrix.com/projects/core/documentation/howto/glossary.html#Factory глоссарий])  
+
  # Так как бот -- это клиентское приложение, то и factory (см выше)  
  # тоже будет клиентским. Модуль twisted.words.protocols.jabber.client
+
  # тоже будет клиентским. Библиотека twisted.words.protocols.jabber.client
 
  # предоставляет класс для создания factory Jabber-клиентов.
 
  # предоставляет класс для создания factory Jabber-клиентов.
 
  factory = client.basicClientFactory(me, "password")
 
  factory = client.basicClientFactory(me, "password")
Line 61: Line 46:
 
  # что-то вроде "открыть сокет, подождать ответ, послать логин/пароль,  
 
  # что-то вроде "открыть сокет, подождать ответ, послать логин/пароль,  
 
  # подождать и т.д." тоже нельзя. Для того, чтобы выполнить какие-то
 
  # подождать и т.д." тоже нельзя. Для того, чтобы выполнить какие-то
  # определенные действия после авторизации, необходимо создать callback:
+
  # определенные действия после авторизации, наеобходимо создать callback:
 
  def authd(xmlstream):
 
  def authd(xmlstream):
 
     # создание XML элемента presence.
 
     # создание XML элемента presence.
Line 80: Line 65:
 
  # пришло.
 
  # пришло.
 
  def gotMessage(message):
 
  def gotMessage(message):
     # sorry for the str(), makes unicode happy
+
     # 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(str(e))
+
        print unicode(e.__str__())
            break
+
        break
 
   
 
   
 
  # Теперь регистрация callback-а authd.
 
  # Теперь регистрация callback-а authd.
Line 97: Line 82:
  
 
== Ссылки ==
 
== Ссылки ==
 +
[[: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://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)