我目前正在研究Twisted框架作为实现基于网络的备份应用程序的一种方式,我想实现一些我在网上找不到的例子。
我计划使用Perspective Broker实现系统,但我还需要一种将二进制文件从客户端传输到服务器的方法。我希望能够在PB上调用一个方法,然后使用某种UID通过单独的数据通道发送文件。
拥有这两个独立的通信渠道的原因在于我想让客户端多线程(一个线程扫描目录树,而另一个线程将更改的文件传输到服务器)。
Twisted可以实现吗?我已经读过,在反应堆上调用方法的多个线程是个坏消息,所以这个架构注定要失败吗?
我很感激任何正确方向的指针,正如我所提到的,我仍在研究可能性 - 但我计划将Django用于这个项目,所以Python是必须的。
答案 0 :(得分:2)
拥有这两个独立的通信渠道的原因在于我想让客户端多线程(一个线程扫描目录树,而另一个线程将更改的文件传输到服务器)。
这种推理没有遵循。你可以使用在单个套接字上运行的单个协议,即使你有一个在文件系统中寻找工作的线程。
可能其他理由要发送文件数据的方式与在客户端和服务器之间发送元数据或其他结构化数据的方式不同。但是,想到的主要问题是您可能不想强制命令等待文件完成,PB的FilePager
类可以解决这个问题。
如果要在使用Twisted的应用程序中使用线程,要记住的主要事情是,无论何时您想从任何线程调用Twisted API''除了''反应堆运行的线程,您必须使用reactor.callFromThread
(或仅基于该方法构建的API,例如twisted.internet.threads.blockingCallFromThread
)。
callFromThread
向反应堆线程发送一些工作(以要调用的对象的形式),反应堆将安排在那里“尽快”调用它。您从错误的线程调用的任何其他Twisted API将具有未定义的结果。