多线程再平时的树莓派中将会非常广泛——比如控制多个电机同时运动等等 莫凡大神视频地址大神视频教学链接
线程开始就是这一步完成,继续下一步,与此同时,分出了一个支线,并且开始支线
import threading import time def job(): print('T1 start\n') for i in range(10): time.sleep(0.1) print('T1 finish\n') #print('number:%s'%threading.current_thread()) def T2(): print('T2 start\n') print('T2 finish\n') def main(): for i in range(4): add_thread = threading.Thread(target=job,name = 'T1') #启动线程1来运行job函数 add_thread2 = threading.Thread(target=T2,name = 'T2') #启动线程2来运行T2函数 add_thread.start() #add_thread启动 add_thread2.start() #add_thread2启动 add_thread.join() #join当add_thread完成后再执行以下操作 print('all done\n') #print(threading.active_count()) #print(threading.enumerate()) #print(threading.current_thread()) main() import threading import time from queue import Queue #queue可以让多线程函数有返回值 def job(l,p): for i in range(len(l)): l[i] = l[i]**2 print('job start\n') print('job finshed\n') p.put(l) #将q放入列表l当中 def mul(): q = Queue() #Queue---放入返回值 thrads = [] data = [[1,2,3],[4,5,6],[7,8,9],[4,5,8]] for i in range(4): #这里用于开启多4个线程分别运算data[i] t = threading.Thread(target = job,args = (data[i],q)) #对已经开启的线程进行传参数(data[i],q) #创建线程 print(t) t.start() #开始第i线程 继续往下走 thrads.append(t) for f in thrads: f.join() print('wancheng???') #等第i个线程结束了继续往下走 results = [] for t in range(4): results.append(q.get()) #q.get()从q中读取一个值(只有按顺序拿出一个) print('append') print(results) mul()说明:设计了一个class,用来直接调用motor模块进行控制,减小代码量,减小读者阅读难度
import RPi.GPIO as GPIO import time import threading #指定第一个电机的GPIO口 IN1 = 40 # pin40 IN2 = 38 IN3 = 36 IN4 = 35 #指定第二个电机的GPIO口 IN5 = 18 IN6 = 16 IN7 = 13 IN8 = 15 #设置两台电机的频率和步数 motor1_delay = 0.0002 motor1_steps = 4000 motor2_delay = 0.02 motor2_steps = 400 #定义电机的类 class Motor: def __init__(self,I1,I2,I3,I4): #初始化类的参数 self.I1 = I1 self.I2 = I2 self.I3 = I3 self.I4 = I4 GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) # 设置寻址模式,按照pin引脚寻址 GPIO.setup(self.I1, GPIO.OUT) # 指定IN1输出 GPIO.setup(self.I2, GPIO.OUT) GPIO.setup(self.I3, GPIO.OUT) GPIO.setup(self.I4, GPIO.OUT) def loop(self,delay_loop,steps_loop): print ("backward...") Motor.backward(self,delay_loop,steps_loop) print ("stop...") Motor.stop(self) # stop time.sleep(3) # sleep 3s print ("forward...") Motor.forward(self,delay_loop,steps_loop) print ("stop...") Motor.stop(self) time.sleep(3) def setStep(self, w1, w2, w3, w4): #GPIO.output()---指定脚位输出high还是low GPIO.output(self.I1, w1)#.output(in1,1)代表指定IN1引脚输出的是高电平,0就是低电平 GPIO.output(self.I2, w2) GPIO.output(self.I3, w3) GPIO.output(self.I4, w4) def backward(self, delay, steps): for i in range(0, steps): Motor.setStep(self,1, 0, 0, 1) time.sleep(delay) Motor.setStep(self,0, 1, 0, 1) time.sleep(delay) Motor.setStep(self,0, 1, 1, 0) time.sleep(delay) Motor.setStep(self,1, 0, 1, 0) time.sleep(delay) def forward(self,delay, steps): for i in range(0, steps): Motor.setStep(self,1, 0, 1, 0) time.sleep(delay) Motor.setStep(self,0, 1, 1, 0) time.sleep(delay) Motor.setStep(self,0, 1, 0, 1) time.sleep(delay) Motor.setStep(self,1, 0, 0, 1) time.sleep(delay) def stop(self): Motor.setStep(self,0, 0, 0, 0) def destroy(): GPIO.cleanup() if __name__ == '__main__': #主函数测试 motor1 = Motor(IN1,IN2,IN3,IN4)#实例化类 #motor1.setup(IN1,IN2,IN3,IN4) motor2 = Motor(IN5,IN6,IN7,IN8)#实例化类 #motor2.setup(IN5,IN6,IN7,IN8) try: while True: shuru = int(input('input:')) if shuru ==1: thread1 = threading.Thread(target=motor1.loop, args=(motor1_delay,motor1_steps))#创建线程1 thread2 = threading.Thread(target=motor2.loop, args=(motor2_delay,motor2_steps))#创建线程2 thread1.start()#开始线程1 thread2.start()#开始线程2 except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child function destroy() will be executed. destroy()