【问题标题】:Multiple communication channels with Twisted Python使用 Twisted Python 的多个通信渠道
【发布时间】:2010-10-18 13:53:03
【问题描述】:

我目前正在研究将 Twisted 框架作为实现基于网络的备份应用程序的一种方式,并且我想实现一些我在网上找不到任何示例的东西。

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

拥有这两个独立通信通道的原因是我想让客户端多线程(一个线程扫描目录树,而另一个线程将更改的文件传输到服务器)。

Twisted 可以做到这一点吗?我读过在反应器上有多个线程调用方法是个坏消息,那么这种架构注定要失败吗?

我将不胜感激任何正确方向的指示,正如我所提到的,我仍在研究可能性 - 但我计划在这个项目中使用 Django,所以 Python 是必须的。

【问题讨论】:

    标签: python tcp twisted


    【解决方案1】:

    拥有这两个独立通信通道的原因是我想让客户端多线程(一个线程扫描目录树,而另一个线程将更改的文件传输到服务器)。

    这个推理不成立。您可以使用在单个套接字上运行的单个协议就可以了,即使您有一个线程在文件系统中徘徊寻找工作要做。

    不过,可能有其他原因希望以不同于在客户端和服务器之间发送元数据或其他结构化数据的方式发送文件数据。但是,主要想到的是您可能不想强制命令等待文件完成,PB 的FilePager 类缓解了这个问题。

    如果您要在使用 Twisted 的应用程序中拥有线程,要记住的主要事情是,每当您想从任何线程调用 Twisted API 时,“除了运行反应器的线程之外”,您必须使用reactor.callFromThread(或仅基于该方法构建的API,例如twisted.internet.threads.blockingCallFromThread)。

    callFromThread 将一些工作(以要调用的对象的形式)发送到反应器线程,反应器将安排“很快”调用它。您从错误线程调用的任何其他 Twisted API 都会产生未定义的结果。

    【讨论】:

    • 完美。我不知道FilePager 类的存在,尽管我遇到了一些基于StringPager 的看起来很复杂的实现。我现在有一个基本的转移工作,所以看起来这是一个观众!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多