1

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

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

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

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

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

有没有办法让一个 python 脚本对另一个 ..debug 脚本进行排序?以便一个脚本可以读取或更改另一个脚本中的变量?我找不到一种方法可以让脚本独立启动和停止。

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

4

2 回答 2

1

一个相当有效的方法是使用消息传递。您的每个模块都是独立的,但它们可以相互发送和接收消息。关于在 Python 中实现这一点的许多方法的一个很好的参考是 Python wiki page for parallel processing

通用策略

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

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

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

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

过度杀伤力?

听起来您已经创建了一个简单的实用程序。多处理模块是让程序的不同部分独立运行的绝佳方式。您仍然采用相同的策略(消息传递、不共享共享状态、监督),但采用不同的策略。

于 2012-10-13T00:31:42.187 回答
0

您想要多个独立的进程,并且您希望它们相互交谈。因此:阅读您的操作系统上可用的进程间通信方法。我推荐套接字(通用,将在 an/w 和 diff 操作系统上工作)。您可以轻松地在 TCP 之上发明一个简单的(可能类似于 http)协议,可能使用json来发送消息。Python 发行版附带了一堆类来简化它(SocketServer.ThreadingMixIn、SocketServer.TCPServer 等)。

于 2012-10-13T02:38:23.897 回答