【问题标题】:Multiprocessing on Jetson NANOJetson NANO 上的多处理
【发布时间】:2021-10-26 14:21:57
【问题描述】:

我正在尝试在使用 Jetpack 4.5 闪存的 Jetson NANO 设备上运行一个简单的多处理系统。 我正在做我通常在电脑上做的事情,所以我有一个主脚本,launcher.py

launcher.py

import multiprocessing as mp
from multiprocessing import set_start_method, Queue, Event
from camera_reader import Camera_Reader_Initializer

def main():
    set_start_method("spawn")
    cam_read = mp.Process(target=Camera_Reader_Initializer, args=())
    cam_read.daemon = True
    cam_read.start()

if __name__ == "__main__":
    main()

应该启动脚本camera.py(实际上,连同其他几个脚本) camera.py:

camera.py

print("check 00")

def Camera_Reader_Initializer():
    print('check 01')
    cam_read = Camera_Reader()
    cam_read.run()


class Camera_Reader():
    def __init__(self):
        print('check 02)
        self.source = "/dev/video0"

    def run(self):
        print('check 03')
        input = jetson.utils.videoSource(self.source)
        output = jetson.utils.videoOutput("")
        while output.IsStreaming():
            image = input.Capture(format='rgb8')
            output.Render(image)
            output.SetStatus(f"Video Viewer | {image.width:d}x{image.height:d} | {output.GetFrameRate():.1f} FPS")

但是,在运行 launcher.py 时,我得到的唯一输出是:

check 00

所以,基本上 cam_read 对象没有被创建或运行。我做错了吗?

【问题讨论】:

  • 这应该在任何计算机上“失败”。启动进程后主进程会立即退出,主进程会将SIGTERM发送给任何标有daemon的子进程。你所拥有的实际上是一场比赛,看看新流程可以在terminate()'d 之前打印出什么
  • 该死,我太傻了! :(你说得对,主进程中应该有另一部分,这样一切都会立即结束。我现在正在根据我的需要调整现有脚本,但最终删除了太多东西。非常感谢!

标签: python multiprocessing nvidia-jetson nvidia-jetson-nano


【解决方案1】:

设置Process.daemon = True的功能会导致主进程在退出时调用Process.terminate()。这适用于可以处理在没有警告的情况下关闭的长时间运行的子进程(通常您应该在退出之前处理SIGTERM 信号以进行清理)。

您在“launcher.py”中的主要功能不会等待孩子做任何事情,并且基本上会立即尝试退出。在孩子被杀之前,似乎有足够的时间到达print("check 00") 行。这可能看起来有些一致,但不应该指望它甚至打印出来。这是在主进程开始关闭之前子进程可以完成多少工作之间的竞赛。

解决此问题取决于您希望它如何运行。如果您仍然希望子进程在主进程退出之前一直在后台运行,则需要确保主进程需要一些时间(可能使用time.sleep)。如果孩子正在完成一些有限的工作,它可能不应该是一个守护进程,你应该在它上面调用Process.join() 以等待它在main() 中的某个时间点完成。

【讨论】:

  • 是的,子进程正在从 IP 摄像头读取帧并将它们发送到另一个进程进行详细说明。我通常在主进程中有一个无限循环,并在视频流结束时在子进程中设置一个事件以停止一切。但是,这一次我忘了添加循环。
  • 我马上写了这个答案,然后在点击 sumbit 之前离开了我的电脑一会儿......我后来看到了你之前的评论
猜你喜欢
  • 2021-06-17
  • 2020-01-15
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2020-04-30
  • 2020-06-07
  • 2021-04-21
相关资源
最近更新 更多