有没有一种方法将python程序拆分成独立的模块?

时间:2012-10-13 00:20:48

标签: python multithreading error-handling automation

我正在尝试用python做一些机械自动化,但我遇到了一个问题。

我有代码执行实际控制,代码记录,代码提供GUI,以及其他一些模块都是从单个脚本调用的。

问题是一个模块中的错误会停止所有其他模块。因此,例如,GUI中的错误将导致控制系统失效。

我希望能够独立运行模块,因此可以在不停止其他模块的情况下崩溃,重新启动,修补等等。

我能找到的唯一方法就是将变量存储在SQL数据库或文件中。

有没有办法让一个python脚本排序另一个..debug?这样一个脚本可以读取或更改另一个脚本中的变量?我找不到这样做的方法,也允许脚本独立启动和停止。

有没有人有任何想法或建议?

2 个答案:

答案 0 :(得分:1)

执行此操作的一种相当有效的方法是使用消息传递。您的每个模块都是独立的,但它们可以相互发送和接收消息。关于在Python中实现这一目标的许多方法的一个非常好的参考是parallel processing的Python维基页面。

通用策略

将程序拆分为存在服务器和客户端的部分。然后,您可以使用中间件(如0MQ,Apache ActiveMQ或RabbitMQ)在系统的不同部分之间发送数据。

在这种情况下,您的GUI可以向日志解析器服务器发送消息,告知它开始工作。一旦完成,日志解析器将向有兴趣的人发送广播消息,告诉全世界对结果的引用。 GUI可以是日志解析器订阅的频道的订阅者。收到消息后,它将打开结果文件并显示用户感兴趣的内容。

序列化和反序列化速度也很重要。您希望最小化通信开销。 Google Protocol Buffers和Apache Thrift是这里的有效工具。

您还需要某种形式的监督策略,以防止其中一个服务器发生故障阻止所有内容。 supervisord将为您重新启动,并且很容易配置。同样,它只是这个领域中众多选项中的一个。

过度杀戮?

听起来你已经创建了一个简单的工具。多处理模块是让程序的不同位相当独立运行的绝佳方法。您仍然应用相同的策略(消息传递,没有共享共享状态,监督),但采用不同的策略。

答案 1 :(得分:0)

您想要多个独立的进程,并希望它们相互通信。因此:请阅读您的操作系统上可用的进程间通信方法。我推荐套接字(通用,可以在n / w和diff OS上工作)。您可以轻松地在TCP上发明一个简单的(可能类似于http的)协议,也可以使用json来发送消息。 Python发行版中有许多类可以轻松实现(SocketServer.ThreadingMixIn,SocketServer.TCPServer等)。