【问题标题】:Celery beat task stops fails after a few beats (opencv)几次节拍后芹菜节拍任务停止失败(opencv)
【发布时间】:2014-03-24 13:58:56
【问题描述】:

我有一个 celery 任务,它每 60 秒运行一次以获取网络摄像头,从中获取静止图像,然后将其写入文件,以便服务器稍后可以在网页上提供它。图像拍摄通过 python 中的 cv2 库使用 opencv。

看起来像这样:

    @app.task                               # a task to get and save a webcam image
    def getWebCamImage()                    
    logger.debug("capturing image attempt")
    c = cv2.VideoCapture(0)                 #returns a videocapture object
    flag, frame = c.read()                  #grabs and decodes the next frame
    cv2.imwrite('file/loc/img.jpg, frame)   #writes the frame to a file
    logger.debug('saved image...hopefully') 
    c.release()                             #releases the videocapture object
    return 0

前几分钟一切都很好,但随后它会吐出有关无法获取网络摄像头属性的正常错误并停止。它永远不会重新开始!

    ...DEBUG/BEAT] celerytest.getwebcamimage[process]:capturing image attempt
    VIDOC_QUERYMENU:Invalid argument
    VIDOC_QUERYMENU:Invalid argument
    VIDOC_QUERYMENU:Invalid argument

这正是它工作时的样子,只是它一直在运行。有什么想法可以阻止它吗?我在 rasperry pi 上运行它,240Mb 专用于 arm 核心,16 用于图形。

我为尝试修复它所做的事情:

    $sudo sysctl vm.overvommit_memory=1

所以它不会抛出内存。分配错误 $sudo rmmod ucvideo $sudo modprobe ucvideo nodrop=1 超时=5000 怪癖=0x80 所以司机对凸轮更有耐心。我已经尝试了几个摄像头,所以这可能不是问题。

请帮助您提出任何建议或测试。这是一个棘手的问题,因为它是:在 pi 上,并且是 pi/cellery 十字架。我将尝试仅使用 guvcview 运行脚本,但我觉得 py/opencv 选项更干净,因为它更易于安装,无论哪种方式我都想知道为什么这不起作用!

新闻:

DMESG 显示 celery 进程因为内存不足而被杀死。有任何解决这个问题的方法吗?如果有的话,任务中创建的对象是如何被销毁的?

【问题讨论】:

    标签: python opencv raspberry-pi celery webcam


    【解决方案1】:

    结果证明这与 Celery 无关,而与 cv 有关。

    如果每次释放 CV2.videocapture 对象都没有被删除,所以内存还是被保留的。在内存很少的pi上,这很快就占用了所有内存并被杀死。我在 linux 中使用 top 命令调查了内存使用情况。

    它发生在较大的计算机上,但在 pi 上症状更严重。

    【讨论】:

      猜你喜欢
      • 2012-03-27
      • 2015-05-11
      • 1970-01-01
      • 2018-04-05
      • 2017-01-16
      • 2020-01-23
      • 2021-02-07
      • 2020-07-04
      • 2013-05-16
      相关资源
      最近更新 更多