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 2: Line 2:
 
|            name=Twisted
 
|            name=Twisted
 
<!--      Общая информация          -->
 
<!--      Общая информация          -->
|              url=[http://twistedmatrix.com/ twistedmatrix.com]
+
|              url=http://twistedmatrix.com/trac/
 
|        language={{Lang|l|Python}}
 
|        language={{Lang|l|Python}}
|        xmlparser=внутренний (twisted.words.xish)
+
|        xmlparser=внутренний
 
<!--        Реализация стандартов  -->
 
<!--        Реализация стандартов  -->
 
|          roster=нет
 
|          roster=нет
Line 20: Line 20:
 
}}
 
}}
  
'''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]). Это означает, что всех клиентов обслуживает, грубо говоря, <u>один поток и один цикл</u>, а вся ответственность за "параллелизацию" работы c клиентами ложится на плечи программиста, а не ОС. Такой подход признан более эффективным, но и более сложным в исполнении.  
  
К счастью, вся сложная часть уже реализована в Twisted, а программисту остается только создавать свои обработчики событий и придерживаться нескольких правил:
+
К счастью, вся сложная часть уже реализована в twisted-е, а программисту остается только создавать свои обработчики событий и придерживаться нескольких правил:
# Функция не должна долго думать. Так как все соединения обрабатываются в одном потоке и в одном цикле, то каждая пауза сказывается на всех. Поэтому «долгие» задачи (большие вычисления и&nbsp;т.&nbsp;п.) должны быть выделены в отдельный поток, который в конце работы вернет результат с помощью вызова функции в общем цикле (создание потока и возврат результата можно облегчить с помощью <code>twisted.internet.threads.deferToThread</code>).
+
# Функция не должна долго думать. Так как все соединения обрабатываются в одном потоке и в одном цикле, то каждая пауза сказывается на всех. Поэтому "долгие" задачи (большие вычисления и т.п.) должны быть выделены в отдельный поток, который в конце работы вернет результат с помощью вызова функции в общем цикле (создание потока и возврат результата можно облегчить с помощью twisted.internet.threads.deferToThread).
# Вся работа с внешними и потенциально-тормознутыми данными, а это базы данных, сеть и даже работа с файлами, по тем же причинам должна быть разделена на две части (обычно через объект Deferred): первая отправляет запрос, вторая (callback) обрабатывает результат, когда он появится. Для такой работы с большой частью тормознутых объектов уже подготовлены нужные классы.
+
# Вся работа с внешними и потенциально-тормознутыми данными, а это базы данных, сеть и даже работа с файлами, по тем же причинам должна быть разделена на две части (обычно через объект Deferred): первая отправляет запрос, вторая (callback) обрабатывает результат когда он появится. Для такой работы с большой частью тормознутых объектов уже подготовлены нужные классы.
# Вся работа с сетью осуществляется в небезопасном, с точки зрения потоков, режиме. Поэтому для отправки в сеть каких-либо данных из потока (если вы все же решили выделить отдельный) необходимо воспользоваться специальными функциями, которые вставят отправку в общий цикл (<code>reactor.callFromThread</code>). То же касается и других вещей, которые в многопоточной программе требовали блокировок.
+
# Вся работа с сетью осуществляется в небезопасном, с точки зрения потоков, режиме. Поэтому для отправки в сеть каких-либо данных из потока (если вы все же решили выделить отдельный) необходимо воспользоваться специальными функциями, которые вставят отправку в общий цикл (reactor.callFromThread). То же самое касается и всех других вещей, которые в "многопоточной" программе требовали блокировок.
  
== Для Jabber-разработчика ==
+
== Для Jabber разработчика ==
Реализация Jabber протокола находится в пакете <code>twisted.words.protocols.jabber</code>.
+
Реализация Jabber протокола находится в пакете twisted.words.protocols.jabber.  
{{Todo|про создание и отправку стансов}}
+
{{Todo|про создание и отправку станз}}
 
{{Todo|про создание обработчиков}}
 
{{Todo|про создание обработчиков}}
 +
{{Todo|что такое Twisted.Words и как оно относится к Twisted?}}
  
 
=== Пример клиентского приложения ===
 
=== Пример клиентского приложения ===
 
Пример простого бота для 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 54:
 
  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 (см [http://twistedmatrix.com/projects/core/documentation/howto/glossary.html#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 95: Line 96:
 
  # Запуск реактора
 
  # Запуск реактора
 
  reactor.run()
 
  reactor.run()
 +
 +
== См. также ==
 +
[[:Category:Программы, использующие Twisted|Программы, использующие 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 Пример реализации] протокола {{w|Finger}} с помощью Twisted
+
* [http://twistedmatrix.com/projects/core/documentation/howto/tutorial/index.html пример реализации протоколо 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)