Причина наличия этих двух отдельных каналов связи заключается в том, что я хотел бы сделать клиент многопоточным (один поток сканирует дерево каталогов, а другой поток передает измененные файлы на сервер).
Это рассуждение не следует. Вы можете просто использовать один протокол, работающий через один сокет, даже если у вас есть поток, блуждающий по файловой системе в поисках работы.
Могут быть другие причины желать отправлять данные файла иначе, чем вы отправляете метаданные или другие структурированные данные между клиентом и сервером. Однако главное, что приходит на ум, - это то, что вы, возможно, не захотите заставлять команды ожидать завершения файлов, и эта проблема устраняется классом PB FilePager
.
Главное, что нужно помнить, если вы хотите иметь потоки в приложении, использующем Twisted, это то, что всякий раз, когда вы хотите вызвать Twisted API из любого потока, «кроме» потока, в котором работает реактор, вы должны используйте reactor.callFromThread
(или API, построенный исключительно на этом методе, например twisted.internet.threads.blockingCallFromThread
).
callFromThread
отправляет некоторую работу (в форме объекта для вызова) в поток реактора, где реактор организует вызов его «скоро». Любой другой Twisted API, который вы вызываете из неправильного потока, будет иметь неопределенные результаты.