在 RealSense 中共享上下文时进程冻结
Process freezes when sharing context in RealSense
一个周期性初始化 Realsense 管道的进程,在共享上下文时在一个周期后冻结。
这是一个最小的重新创建代码:
import pyrealsense2 as rs
from multiprocessing import Process
ctx = rs.context()
class RS:
def __init__(self):
print("init")
pipe = rs.pipeline(ctx)
print(pipe)
class Proc(Process):
def __init__(self):
super(Proc, self).__init__()
def run(self):
for i in range(10):
print(i)
RS()
print("after")
vs = Proc()
vs.start()
如果不共享上下文,代码会在 337 个循环后崩溃:
import pyrealsense2 as rs
from multiprocessing import Process
class RS:
def __init__(self):
print("init")
ctx = rs.context()
pipe = rs.pipeline(ctx)
print(pipe)
class Proc(Process):
def __init__(self):
super(Proc, self).__init__()
def run(self):
for i in range(400):
print(i)
RS()
print("after")
vs = Proc()
vs.start()
当使用线程而不是进程时,不会发生这种情况。
在第一个代码片段中(当使用全局 ctx
时),您在主进程中初始化 ctx
,然后创建一个访问该 ctx
的新进程。
在第二个代码片段中(ctx
inside __init__
),您在每次循环迭代中初始化一个新的上下文。
您需要将两者结合起来:在新进程中初始化上下文,但仅初始化一次。类似的东西:
ctx = None
class RS:
def __init__(self):
global ctx
if ctx is None:
ctx = rs.context()
print("init")
pipe = rs.pipeline(ctx)
print(pipe)
一个周期性初始化 Realsense 管道的进程,在共享上下文时在一个周期后冻结。 这是一个最小的重新创建代码:
import pyrealsense2 as rs
from multiprocessing import Process
ctx = rs.context()
class RS:
def __init__(self):
print("init")
pipe = rs.pipeline(ctx)
print(pipe)
class Proc(Process):
def __init__(self):
super(Proc, self).__init__()
def run(self):
for i in range(10):
print(i)
RS()
print("after")
vs = Proc()
vs.start()
如果不共享上下文,代码会在 337 个循环后崩溃:
import pyrealsense2 as rs
from multiprocessing import Process
class RS:
def __init__(self):
print("init")
ctx = rs.context()
pipe = rs.pipeline(ctx)
print(pipe)
class Proc(Process):
def __init__(self):
super(Proc, self).__init__()
def run(self):
for i in range(400):
print(i)
RS()
print("after")
vs = Proc()
vs.start()
当使用线程而不是进程时,不会发生这种情况。
在第一个代码片段中(当使用全局 ctx
时),您在主进程中初始化 ctx
,然后创建一个访问该 ctx
的新进程。
在第二个代码片段中(ctx
inside __init__
),您在每次循环迭代中初始化一个新的上下文。
您需要将两者结合起来:在新进程中初始化上下文,但仅初始化一次。类似的东西:
ctx = None
class RS:
def __init__(self):
global ctx
if ctx is None:
ctx = rs.context()
print("init")
pipe = rs.pipeline(ctx)
print(pipe)