从Twisted调用Python代码

从Twisted调用Python代码,python,multithreading,twisted,Python,Multithreading,Twisted,首先,我应该说这可能更像是一个设计问题,而不是代码本身 我有一个网络,有一个服务器和多个客户机(用Twisted编写,因为我需要这些异步非阻塞特性),这样的服务器-客户机耦合只是接收和发送消息 然而,在某个时刻,我希望一个客户机在收到某个消息时运行python文件。该客户机应该继续侦听和与服务器对话,而且,如果需要,我应该能够停止该文件,因此我的第一个想法是为该python文件启动一个线程,然后忘记它 最后应该是这样的:服务器向ClientA发送消息,ClientA及其dataReceived函

首先,我应该说这可能更像是一个设计问题,而不是代码本身

我有一个网络,有一个服务器和多个客户机(用Twisted编写,因为我需要这些异步非阻塞特性),这样的服务器-客户机耦合只是接收和发送消息

然而,在某个时刻,我希望一个客户机在收到某个消息时运行python文件。该客户机应该继续侦听和与服务器对话,而且,如果需要,我应该能够停止该文件,因此我的第一个想法是为该python文件启动一个线程,然后忘记它

最后应该是这样的:服务器向ClientA发送消息,ClientA及其dataReceived函数解释消息并决定运行该python文件(我不知道需要多长时间,可能包含阻塞调用),当该python文件完成运行时,应将结果发送给ClientB

因此,问题是:

  • 在ClientA中启动一个线程是不是一个好主意
  • 由于我想将该python文件的结果发送到ClientB,我可以在该python文件中有另一个reactor循环吗
无论如何,我会非常感谢任何建议,因为python和twisted都不是我的专长,所有这些想法可能都不是最好的


谢谢

在第一次阅读时,我认为您暗示twisted不是python。如果您这样想,请记住以下几点:

Twisted是一个python框架,即它是python。具体来说,它是关于通过允许程序员在自己的代码中手动调整操作的调度/顺序(这几乎与线程的典型用法相反),最大限度地利用单个进程/线程/内核

虽然您可以在twisted中与线程交互,但在不破坏twisted的效率的情况下进行交互是相当棘手的。(有关线程与事件的详细描述,请参见SO:)

如果您真的想从twisted python中派生出新的python(即,让这项工作在另一个核心上运行),那么我将把它作为一个过程来看待,请参阅本文中Glyph的答案:要获得好的库来完成这项工作

流程提供了适当的分离,让您的twisted应用程序能够在没有明显减速的情况下运行,您应该会发现您的所有启动/停止/暂停/终止需求都会得到满足

具体回答您的问题:

Would it be starting a thread a good idea for that python file in ClientA?
我会说“不”,这通常不是一个好主意,在您的具体案例中,您应该考虑使用流程

Can I have another reactor loop inside that python file?
严格地说,“不,你不能有多个反应堆”——但是twisted可以做的是同时管理数百或数千个单独的任务,所有这些任务都在同一个反应堆中,将完成你需要的任务。也就是说,在一个反应器中运行所有不同的异步任务,这就是twisted构建的目的

顺便说一句,我总是为twisted推荐以下教程:krondo twisted简介很长,但是如果你完成了它,这种工作就会变得非常清楚


祝你一切顺利

谢谢你,迈克!我肯定会看看这些过程(以及twisted教程),似乎这对我来说是可行的。我知道它看起来可能不像我的意思,我只是试图表明我想要运行的是“独立”的东西,即使是对我的客户将处理的事件的反应。至少,我认为他们走的是不同的道路。不管怎样,参考第二个答案,那么我应该在从主代码调用“reactor.connect”(用于该连接)时,在第二个python文件中为第二个连接(A和B之间)设置工厂,因此?谢谢你,迈克@josepmeg:我不知道您想如何将“python文件的结果”(在clientA上运行)获取到clientB。是否要将其发送到服务器,然后让服务器将其发送到clientB?或者您希望clientA直接连接到clientB。。。顺便问一下,这一切是通过什么协议发生的?TCP?UDP?电视连续剧其他的?(我会尝试在评论中帮助您,但如果这变得太复杂,您可能需要用一些代码片段打开一个新问题)因此,我主要担心的是,我不希望ClientA担心python文件,只需启动/停止它。完成该文件后,应将其结果发送到服务器(可能比直接发送到B要好,我可以让服务器重定向)。但是使用一个独立的套接字可能很容易做到这一点,所以我不必使用reactor…我只是想知道哪一个是最好的方法,并且在开始编写代码之前对所有内容都有很好的理解。我现在正在用TCP做所有的事情。谢谢@josepmeg:如果我想象一下如何在clientA上创建逻辑,它将是:(全部在twisted中)clientA连接到服务器,保持TCP连接打开。通过messageReceived,客户端唤醒以处理传入消息。在告知客户机生成“该python文件”的消息的情况下,客户机将调用twisted的spawnprown进程并运行python。退出
processexit
后,clientA将打包结果并
将结果写入服务器TCP连接对象中。为了更清楚,需要代码,请参见上一个示例: