Несколько каналов связи с Twisted Python - PullRequest
2 голосов
/ 18 октября 2010

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

Я планирую внедрить систему с использованием Perspective Broker , но мне также потребуется способ передачи двоичных файлов с клиента на сервер. Я хотел бы иметь возможность вызывать метод на PB, а затем использовать какой-то UID для отправки файла по отдельному каналу данных.

Причина наличия этих двух отдельных каналов связи заключается в том, что я хотел бы сделать клиент многопоточным (один поток сканирует дерево каталогов, а другой поток передает измененные файлы на сервер).

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

Я был бы признателен за любые указатели в правильном направлении, поскольку, как я уже говорил, я все еще изучаю возможности, но я планирую использовать Django для этого проекта, поэтому Python является обязательным.

1 Ответ

2 голосов
/ 18 октября 2010

Причина наличия этих двух отдельных каналов связи заключается в том, что я хотел бы сделать клиент многопоточным (один поток сканирует дерево каталогов, а другой поток передает измененные файлы на сервер).

Это рассуждение не следует. Вы можете просто использовать один протокол, работающий через один сокет, даже если у вас есть поток, блуждающий по файловой системе в поисках работы.

Могут быть другие причины желать отправлять данные файла иначе, чем вы отправляете метаданные или другие структурированные данные между клиентом и сервером. Однако главное, что приходит на ум, - это то, что вы, возможно, не захотите заставлять команды ожидать завершения файлов, и эта проблема устраняется классом PB FilePager.

Главное, что нужно помнить, если вы хотите иметь потоки в приложении, использующем Twisted, это то, что всякий раз, когда вы хотите вызвать Twisted API из любого потока, «кроме» потока, в котором работает реактор, вы должны используйте reactor.callFromThread (или API, построенный исключительно на этом методе, например twisted.internet.threads.blockingCallFromThread).

callFromThread отправляет некоторую работу (в форме объекта для вызова) в поток реактора, где реактор организует вызов его «скоро». Любой другой Twisted API, который вы вызываете из неправильного потока, будет иметь неопределенные результаты.

...