Python线程。计时器返回值

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

我使用Python中的threading.Timer()集成陀螺仪值。 从leftTurn()调用turn函数。现在我想在达到最大角度时返回一个True to leftTurn()。我的问题是turn()中的递归。是否有可能让leftTurn()知道回合何时结束

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