【问题标题】:Calling Python code from Twisted从 Twisted 调用 Python 代码
【发布时间】:2015-06-16 16:10:55
【问题描述】:

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

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

但是,在某些时候,我希望一个客户端在收到特定消息时运行 python 文件。该客户端应该继续监听和与服务器对话,而且,如果需要,我应该能够停止该文件,所以我的第一个想法是为该 python 文件启动一个线程并忘记它。

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

所以,问题是:

  • 为 ClientA 中的那个 python 文件启动一个线程是个好主意吗?
  • 由于我想将该 python 文件的结果发送到 ClientB,我可以在该 python 文件中再添加一个反应器循环吗?

无论如何,我都非常感谢任何建议,因为 python 和 twisted 都不是我的专长,所有这些想法可能都不是最好的。

谢谢!

【问题讨论】:

    标签: python multithreading twisted


    【解决方案1】:

    在第一次阅读时,我虽然你在暗示扭曲不是 python。如果您有这种想法,请记住以下几点:

    Twisted 是一个 Python 框架,即 I.E.它是蟒蛇。具体来说,它是关于通过允许程序员在他们自己的代码中手动调整调度/操作顺序(这几乎与线程的典型使用相反)来充分利用单个进程/线程/内核。

    虽然您可以在 twisted 中与线程交互,但要在不破坏 twisted 效率的情况下做到这一点非常棘手。 (有关线程与事件的详细描述,请参见 SO:https://stackoverflow.com/a/23876498/3334178

    如果您真的想从扭曲的 python 中生成新的 python(即让这项工作在不同的核心上运行),那么我会考虑将其作为一个进程生成,请参阅 Glyph 在此 SO 中的回答:https://stackoverflow.com/a/5720492/3334178让优秀的图书馆完成这项工作。

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

    具体回答您的问题:

    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 可以同时管理成百上千个单独的任务,所有这些都在同一个反应器中,可以满足你的需要。 IE。在一个反应​​器中运行所有不同的异步任务,这就是扭曲的目的。

    顺便说一句,我一直推荐twisted的以下教程:krondo Twisted 简介http://krondo.com/?page_id=1327它很长,但是如果你通过它,这种工作会变得很清楚。

    一切顺利!

    【讨论】:

    • 谢谢迈克!我一定会看看这些过程(和扭曲的教程),似乎对我有用。我知道它可能看起来不像我的意思,我只是试图表明我想要运行的是“独立”的东西,即使是对我的客户将处理的事件的反应。至少,我确实认为他们走的是不同的道路。无论如何,参考第二个答案,那么我应该在第二个python文件中拥有工厂等第二个连接(A和B之间),同时从主代码调用“reactor.connect”(用于该连接)?谢谢迈克!
    • @josepmeg:我很困惑您希望如何将“该 python 文件的结果”(在客户端 A 上运行)获取到客户端 B。你想把它发送到服务器,然后让服务器把它发送给clientB吗?或者您是否希望 clientA 直接连接到 clientB ...顺便说一句,这一切是通过什么协议发生的? TCP? UDP?串行?其他? (我会尝试在 cmets 中帮助您,但如果这变得太复杂,您可能需要使用一些代码 sn-ps 打开一个新问题)
    • 所以,我主要担心的是我不希望 ClientA 担心那个 python 文件,只需启动/停止它。当该文件完成后,应将其结果发送到服务器(可能比直接发送到 B 更好,我可以让服务器重定向事物)。但是只使用一个独立的插座可能很容易做到这一点,所以我不必为此使用反应器......我只是想弄清楚哪一个是最好的方法,并且对所有事情都有很好的了解在开始编写代码之前。我现在正在使用 TCP 做所有事情。谢谢!
    • @josepmeg:如果我想象如何在 clientA 上创建逻辑,那将是:(全部在扭曲中)clientA 连接到服务器,保持 TCP 连接打开。通过 messageReceived 客户端唤醒以处理传入的消息。在消息告诉客户端生成“那个 python 文件”的情况下,客户端将调用 twisted 的 spawnProcess 和 python 来运行。在processExited 上,clientA 将结果打包,write 在服务器 TCP 连接对象中打包结果。为了更清楚,将需要代码,请参阅最后一个示例:stackoverflow.com/a/30399317/3334178
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多