python中多处理的成本

时间:2015-11-22 14:43:46

标签: python python-multiprocessing

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

问题背景:我使用无线电模块将数据从传感器传输到树莓派。我在pi上运行了一个python脚本,捕获数据并处理它 - 将它放在MySQL数据库中,偶尔会触发其他东西。

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

思考的人? 编辑添加:

  • 传感器以8秒及以上的间隔推送数据
  • 不容易缓冲
  • 如果处理时间比下次读取的时间长,则会被忽略并丢失。 (传输系统 保证交付 - 我需要保证pi能够接受 收到它)

2 个答案:

答案 0 :(得分:0)

我认为你正试图同时解决两个问题,而且这让人感到困惑。

  1. 轮询频率:这里的问题是,您需要多快地轮询数据,这样您就不会有丢失的风险
  2. 并发和i / o锁定:如果处理时间超过频率间隔
  3. 会发生什么

    第一个问题完全取决于您的底层架构:您的传感器推送轮询到您的Raspberry?是否涉及任何缓冲?如果您的轮询频率快于数据到达率,会发生什么?

    我的建议是强制执行KISS原则,并基本上编写两个工具:一个完全负责存储数据数据的工具;另一个负责用数据做某事的人。

    例如,如果您处于原型设计级别,则可以通过memcached实例进行存储,甚至可以通过简单的shell pipe进行存储。然后,操纵数据的第二个实用程序不必担心轮询频率,I / O错误(如果SQL数据库错误会怎样?),等等。

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

    • 更容易测试(您可以将一些数据存储为样本,然后将其回复到操作例程以验证行为)
    • 更容易隔离问题
    • 扩展速度更快(你可以拥有所需数量的“操纵器”)

答案 1 :(得分:0)

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

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

在处理方面,请确保您不要使系统过载。 我正在做一些非常相似的工作:我正在扫描一个文件夹(文件不断放置),我在每个文件上都做了。

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

我的主循环看起来像这样:

#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监视它的资源消耗并将应用程序限制为适当的最大线程数。