python 中的多处理成本

Costs of multiprocessing in python

在 python 中,创建另一个进程的成本是多少 - 它是否足够高以至于不值得作为一种处理事件的方式?

问题背景:我正在使用无线电模块将数据从传感器传输到 raspberry pi。我在 pi 上有一个 python 脚本 运行ning,捕获数据并处理它 - 将它放在 MySQL 数据库中,偶尔触发其他事情。

我的困境是,如果我在单个脚本中处理所有内容,则存在某些数据包可能被忽略的风险,因为 运行 处理时间太长。我可以通过产生一个单独的进程来处理事件然后死掉来避免这种情况 - 但如果创建进程的成本很高,那么我可能值得专注于比创建进程更高效的代码。

思人? 编辑添加:

我认为你试图同时解决两个问题,而且越来越混乱。

  1. 轮询频率:这里的问题是,您需要以多快的速度轮询数据,以免丢失一些数据
  2. 并发和i/o锁定:如果处理时间超过频率间隔会发生什么

第一个问题完全取决于您的底层架构:您的传感器是 pushing 还是 polling 到您的 Raspberry?是否涉及任何缓冲?如果您的轮询频率快于数据到达率会怎样?

我的建议是强制执行 KISS 原则并基本上编写两个工具:一个完全负责存储数据 数据,根据需要尽快;另一个负责 处理数据

例如,如果您处于原型设计级别,则可以通过 memcached instance, or even a simple shell pipe 完成存储。处理数据的第二个实用程序不必担心轮询频率、I/O 错误(如果 SQL 数据库错误怎么办?),等等。

作为奖励,解耦数据检索和操作允许您:

  • 测试更容易(您可以存储一些数据作为样本,然后将其回复到操作例程以验证行为)
  • 更轻松地隔离问题
  • 扩展速度更快(您可以根据需要拥有任意数量的 "manipulators")

生成新线程的成本取决于您对它们的处理方式。

在内存方面,请确保您的线程不会自行加载所有内容,线程共享整个应用程序的内存,因此变量保持其范围。

在处理方面,请确保您的系统没有超载。 我正在为工作做一些非常相似的事情:我正在扫描一个文件夹(文件不断地放在那里),我在每个文件上做一些事情。

我使用我的主线程来初始化应用程序并生成 child 个线程。 一个 child 线程用于日志记录。 其他child为实际工作

我的主循环是这样的:

#spawn logging thread
while 1:
    for stuff in os.walk('/gw'):
        while threading.active_count() > 200:
            time.sleep(0.1)
        #spawn new worker thread sending the filepath
    time.sleep(1)

这基本上意味着我的应用程序不会使用超过 201 个线程(200 + 主线程)。

所以它只是在玩应用程序,使用 htop 来监控它的资源消耗并将应用程序限制在适当的最大线程数。