Jetson NANO 上的多处理
Multiprocessing on Jetson NANO
我正尝试在 Jetson NANO 设备上 运行 一个简单的多处理系统,使用 Jetpack 4.5 刷新。
我正在做我通常在计算机上做的事情,所以我有一个主脚本,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")
然而,当 运行ning launcher.py 我得到的唯一输出是:
check 00
因此,基本上 cam_read 对象未创建或 运行。我做错了什么吗?
设置Process.daemon = True
的功能会导致主进程在退出时调用Process.terminate()
。这意味着长时间 运行ning child 进程可以在没有警告的情况下处理关闭(通常你应该在退出前处理 SIGTERM
信号进行清理)。
您在“launcher.py”中的主要功能不会等待 child 执行任何操作,并且基本上会立即退出。 child 似乎有足够的时间在它被杀死之前到达 print("check 00")
行。这可能看起来有些一致,但即使打印出来也不应该指望它。这是一场 child 在主进程开始关闭之前可以完成多少的竞赛。
解决这个问题取决于您希望它如何运作。如果您仍然希望 child 永远在后台 运行 直到主进程退出,您需要确保主进程需要一些时间(可能 time.sleep
)。如果 child 正在完成一些有限的工作,它可能不应该是一个守护进程,你应该调用 Process.join()
等待它在 main()
的某个时间点完成。 =17=]
我正尝试在 Jetson NANO 设备上 运行 一个简单的多处理系统,使用 Jetpack 4.5 刷新。 我正在做我通常在计算机上做的事情,所以我有一个主脚本,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")
然而,当 运行ning launcher.py 我得到的唯一输出是:
check 00
因此,基本上 cam_read 对象未创建或 运行。我做错了什么吗?
设置Process.daemon = True
的功能会导致主进程在退出时调用Process.terminate()
。这意味着长时间 运行ning child 进程可以在没有警告的情况下处理关闭(通常你应该在退出前处理 SIGTERM
信号进行清理)。
您在“launcher.py”中的主要功能不会等待 child 执行任何操作,并且基本上会立即退出。 child 似乎有足够的时间在它被杀死之前到达 print("check 00")
行。这可能看起来有些一致,但即使打印出来也不应该指望它。这是一场 child 在主进程开始关闭之前可以完成多少的竞赛。
解决这个问题取决于您希望它如何运作。如果您仍然希望 child 永远在后台 运行 直到主进程退出,您需要确保主进程需要一些时间(可能 time.sleep
)。如果 child 正在完成一些有限的工作,它可能不应该是一个守护进程,你应该调用 Process.join()
等待它在 main()
的某个时间点完成。 =17=]