使用Twisted Python的多种通信渠道

2 投票
1 回答
825 浏览
提问于 2025-04-16 05:40

我现在正在研究Twisted框架,想用它来实现一个基于网络的备份应用程序,但我想做的事情在网上找不到任何例子。

我打算使用Perspective Broker来实现这个系统,但我还需要一种方法来把二进制文件从客户端传输到服务器。我希望能在PB上调用一个方法,然后用某种UID来通过一个单独的数据通道发送文件。

之所以要有这两个独立的通信通道,是因为我想让客户端支持多线程(一个线程负责扫描目录树,另一个线程负责把更改的文件传输到服务器)。

在Twisted中这样做可能吗?我听说多个线程同时调用反应器的方法是不好的,那么这样的架构会失败吗?

如果能给我一些正确的方向建议,我会很感激,因为我还在研究各种可能性——不过我计划用Django来做这个项目,所以Python是必须的。

1 个回答

2

我想要有两个不同的通信渠道,是因为我想让客户端支持多线程(一个线程负责扫描文件夹,另一个线程负责把更改过的文件传输到服务器)。

这个想法其实不太合理。即使有一个线程在文件系统里寻找工作,你也可以只用一个协议通过一个套接字来运行,这样完全没问题。

不过,可能还有其他原因让你想要以不同的方式发送文件数据和元数据或其他结构化数据在客户端和服务器之间。最主要的原因是,你可能不想让命令在文件传输完成之前就得等待,而这个问题可以通过PB的FilePager类来解决。

如果你在使用Twisted的应用程序中要使用线程,记住一件事:每当你想从任何线程(除了反应器运行的那个线程)调用Twisted的API时,你必须使用reactor.callFromThread(或者基于这个方法构建的API,比如twisted.internet.threads.blockingCallFromThread)。

callFromThread会把一些工作(以一个要调用的对象的形式)发送到反应器线程,反应器会安排“尽快”调用它。如果你从错误的线程调用其他的Twisted API,结果是不可预测的。

撰写回答