Python线程。计时器返回值
我使用Python中的threading.Timer()集成陀螺仪值。 从leftTurn()调用turn函数。现在我想在达到最大角度时返回一个True to leftTurn()。我的问题是turn()中的递归。是否有可能让leftTurn()知道回合何时结束Python线程。计时器返回值,python,recursion,Python,Recursion,我使用Python中的threading.Timer()集成陀螺仪值。 从leftTurn()调用turn函数。现在我想在达到最大角度时返回一个True to leftTurn()。我的问题是turn()中的递归。是否有可能让leftTurn()知道回合何时结束 class navigation(): def __init__(self): self.mpu = mpu6050(0x68) def getOffset(self): gyro_d
class navigation():
def __init__(self):
self.mpu = mpu6050(0x68)
def getOffset(self):
gyro_data = self.mpu.get_gyro_data()
offset = abs(gyro_data['z'])
return offset
def turn(self, angle,offset,maxAngle):
gyro_data = self.mpu.get_gyro_data()
gyroZ = abs(gyro_data['z'])
angle = abs(angle + (gyroZ-offset)*0.01)
if angle < maxAngle:
threading.Timer(0.001, self.turn, [angle,offset,maxAngle]).start()
else:
motor().stop()
return True
class motor():
...
def leftTurn(self, maxAngle):
self.left()
offset = navigation().getOffset()
navigation().turn(0,offset,maxAngle)
class导航():
定义初始化(自):
self.mpu=mpu6050(0x68)
def getOffset(自):
gyro_data=self.mpu.get_gyro_data()
偏移量=abs(陀螺仪数据['z'])
返回偏移量
def转向(自身、角度、偏移、最大角度):
gyro_data=self.mpu.get_gyro_data()
陀螺z=abs(陀螺U数据['z'])
角度=abs(角度+(陀螺Z偏移)*0.01)
如果角度<最大角度:
线程。计时器(0.001,自转,[角度,偏移,最大角度])。开始()
其他:
电机()停止()
返回真值
类电机():
...
def左转弯(自身、最大角度):
self.left()
偏移量=导航().getOffset()
导航().转弯(0,偏移,最大角度)
类导航()
定义初始化(自):
self.mpu=mpu6050(0x68)
def getOffset(自):
gyro_data=self.mpu.get_gyro_data()
偏移量=abs(陀螺仪数据['z'])
返回偏移量
def转向(自身、角度、偏移、最大角度):
gyro_data=self.mpu.get_gyro_data()
陀螺z=abs(陀螺U数据['z'])
角度=abs(角度+(陀螺Z偏移)*0.01)
如果角度<最大角度:
线程=线程计时器(0.001,自转,[角度,偏移,最大角度])
thread.start()#启动线程
thread.join()#>ait用于结束线程
返回真值
其他:
电机()停止()
返回真值
因为您不需要返回turn
的值,您只想知道线程已经结束,所以可以使用等待线程结束
定时器是线程的一个子类
和往常一样,您应该尝试用循环替换递归。在这种情况下,我会这样做:
def turn(self, angle, offset, maxAngle):
while angle < maxAngle:
threading.wait(0.001)
gyro_data = self.mpu.get_gyro_data()
gyroZ = abs(gyro_data['z'])
angle = abs(angle + (gyroZ-offset)*0.01)
else:
motor().stop()
return True
def转弯(自身、角度、偏移、最大角度):
当角度<最大角度时:
线程。等待(0.001)
gyro_data=self.mpu.get_gyro_data()
陀螺z=abs(陀螺U数据['z'])
角度=abs(角度+(陀螺Z偏移)*0.01)
其他:
电机()停止()
返回真值
我想知道你为什么在你的原始代码中使用
线程
,以及你是否真的需要使用它。你想在leftTurn中等待turn
完成吗?是的,在leftTurn中我想等待turn完成。我得到错误:thread=threading.Timer(0.001,self.turn[angle,offset,maxAngle])。start()TypeError:“instancemethod”对象没有属性“getitem”,我错误地删除了一个逗号:thread=threading.Timer(0.001,self.turn,[angle,offset,maxAngle])。start()
。注意:您可以使用`突出显示代码文本。感谢您的解决方案,它正在工作。刚刚达到最大线程数他为什么要用循环替换递归?@YassineFaris,OP说“我的问题是turn()中的递归”,所以我假设OP面临最大递归深度
错误。我不介意替换线程,但我怎么能让函数等待0.001ms?如果需要阻塞等待,您应该import time
和time.sleep(0.001)
。
def turn(self, angle, offset, maxAngle):
while angle < maxAngle:
threading.wait(0.001)
gyro_data = self.mpu.get_gyro_data()
gyroZ = abs(gyro_data['z'])
angle = abs(angle + (gyroZ-offset)*0.01)
else:
motor().stop()
return True