如何将其转换为多进程工作?



我正在研究一个机器人,想在我的树莓派上完成所有的处理。我开始研究多线程,这看起来很有前途,但当我试图做更多的操作时,rpi正在节流。

这是一个类,它获取坐标并告诉我们是向上向下移动还是向右向左移动。

我已经从我的main.py文件中添加了要更改的变量

是否有可能在不同的CPU中工作,或者我应该改变我的方法?

Controller.py
from dataPointObject.dataPointObjectClass import *
import threading

class Drive:
def __init__(self, frameInfo=FrameInfo()):
self.facePoint = FacePoint() // changing from main.py
self.obstaclePoint = ObstaclePoint() // changing from main.py
self.frameInfo = frameInfo
self.isDetected = False // changing from main.py
self.stopped = False // changing from main.py
def start(self):
print('Started')
threading.Thread(name='Drive', target=self.drive).start()
threading.Thread(name='AdjustCamera', target=self.adjustCamera).start()
return self
def drive(self):
while not self.stopped:
while self.isDetected:
if self.facePoint.x+self.facePoint.w > self.frameInfo.frameWidthLimitR:  # Right Screen Margin
print('LEFT')
elif self.facePoint.x < self.frameInfo.frameWidthLimitL:  # Left Screen Margin
print('RIGHT')
def adjustCamera(self):
while not self.stopped:
while self.isDetected:
if self.facePoint.y < self.frameInfo.frameHeightLimitT:  # Top Screen Margin
print('DOWN')
elif self.facePoint.y + self.facePoint.h > self.frameInfo.frameHeightLimitB:  # Bottom Screen Margin
print('UP')
def stop(self):
self.isDetected = False
self.stopped = True
def faceDetected(self , isDetected = False):
self.isDetected = isDetected
def setFacePoint(self,facePoint):
self.facePoint = facePoint

这是我调用来开始处理的函数。VideoGet和VideoShow在不同的线程上工作

def start(source=0):
video_getter = VideoGet(source).start()
video_shower = VideoShow(video_getter.frame , video_getter.frameInfo).start()
drive = Drive(frameInfo = video_getter.frameInfo).start()
while True:
drive.faceDetected(video_shower.facePoint != FacePoint())
drive.setFacePoint(video_shower.facePoint)
if video_getter.stopped or video_shower.stopped:
video_shower.stop()
video_getter.stop()
drive.stop()
break
frame = video_getter.frame
video_shower.frame = frame

在命令行中通过top命令查看%CPU。如果它是100%左右,那么程序只使用单核。Python线程受到GIL的限制,为了使用所有可用的cpu,我们必须使用多处理而不是多线程。

或者,如果rpi因为高温而节流,那么您可以在while roop中设置适当的毫秒睡眠时间(如time.sleep(0.02))。这是一个非常简单的解决方案,它有效。

最新更新