2009-12-06 4 views
3

Я работаю над написанием клиента Python для сетей прямого подключения P2P. По сути, он работает, подключаясь к центральному серверу и реагируя на других пользователей, которые ищут файлы.Правильный способ внедрения клиента прямого подключения в Twisted?

Иногда другой клиент попросит нас подключиться к ним, и они могут начать загрузку файла у нас. Это прямое подключение к другому клиенту и не проходит через центральный сервер.

Каков наилучший способ обработки этих соединений с другими клиентами? В настоящее время я использую один реактор Twisted для подключения к серверу, но лучше ли иметь несколько реакторов, по одному на каждого клиента, причем каждый из них работает в другом потоке? Или было бы лучше иметь полностью отдельный скрипт Python, который выполняет соединение с клиентом?

Если есть другое решение, о котором я не знаю, я бы хотел его услышать. Я новичок в программировании с Twisted, поэтому я открыт для предложений и других ресурсов.

Спасибо!

ответ

3

Не зная все детали протокола, я бы еще рекомендовал использовать один реактор - реактор масштабирует довольно хорошо (особенно продвинутые из них, таких как PollReactor) и таким образом, вы будете избежать накладные расходов, связанные с потоками (вот как Twisted и другие асинхронные системы получают базовое повышение производительности, в конце концов, избегая таких накладных расходов). На практике потоки в Twisted полезны в основном, когда вам нужно взаимодействовать с библиотекой, функции которой могут блокироваться на вас.

+0

Это очень полезно, спасибо! Однако, как бы один реактор обрабатывал медленную сетевую запись? Для передачи файла, даже в очень маленьких фрагментах, таких как 4 МБ, требуется время для передачи этих данных другому клиенту. Есть ли способ сделать метод transport.write() не блокировать остальную часть программы? – Alex

+0

Правильный 'transport.write' в Twisted не будет блокироваться: он напишет, что он может, и оставит остальное в следующий раз, когда можно будет записать еще несколько данных! ('writeSequence' также часто полезен, но также не блокируется). –

+0

Например, см. Источник twisted.internet.abstract.FileDescriptor.write, at http://twistedmatrix.com/trac/browser/trunk/twisted/internet/abstract.py - многие классы транспорта наследуют его и их ' write' в конечном итоге делегируют: каждый класс затем реализует 'writeSomeData' для записи байтов без блокировки, когда это возможно (вызывается из' doWrite'), и возвращает количество записанных байтов. –

 Смежные вопросы

  • Нет связанных вопросов^_^