python - 在 python 进程中更新变量
问题描述
我正在使用套接字将命令从一个 RPi 发送到另一个。接收 rpi 在接收到命令“turnRight”时转动伺服(通过运行 Yservo 函数),并在接收到“stop”时通过终止进程来停止转动伺服。伺服位置从一半开始,即 x = 50。问题是伺服位置未在主代码中更新,因此下次运行该过程时,它再次从 50 开始。
我需要更新/更改python进程中的值(让Yservo打破它的while循环。例如while state == True:,所以当状态更新为false时,while循环中断并可以返回值x终止进程)或让进程更新主实例中的变量(x)。
接收代码:
import socket
from multiprocessing import Process
import RPi.GPIO as gpio
import time
gpio.setmode(gpio.BCM)
ps = 27
ys = 28
gpio.setup(ps,gpio.OUT)
gpio.setup(ys,gpio.OUT)
pitchS = gpio.PWM(ps,50)
pitchS.start(0)
x = 50
def Yservo(): #x is starting position / current position
global x
while 1:
x += 1
pitchS.ChangeDutyCycle(x)
time.sleep(1)
print(x)
if x >= 100:
while 1:
pass
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('', 6666))
print ("UDPServer Waiting for client on port 6666")
try:
while True:
dataFromClient, address = server_socket.recvfrom(256)
data = str(dataFromClient.decode('utf-8'))
data = data.split(',')
if data[0] == 'turnRight':
TS = Process(target=Yservo,args=())
TS.daemon = True
TS.start()
#TS.join()
if data[0] == 'stop':
TS.terminate()
TS.join()
except:
print('STOP! wait a minute')
TS.terminate()
TS.join()
解决方案
我建议让您的进程保持活动状态,或者每次都生成/杀死它,并让它每 1 秒侦听一次队列以从主进程获取订单。x>=100
此外,只要您不终止子流程,您在 Yservo 子流程中的内部 while 循环将最大化您的核心之一,这是不可取的。这个版本会记住你之前停在的位置:
import socket
from multiprocessing import Process, Queue
import RPi.GPIO as gpio
import time
import Queue
gpio.setmode(gpio.BCM)
start_position=50
ps = 27
ys = 28
gpio.setup(ps,gpio.OUT)
gpio.setup(ys,gpio.OUT)
pitchS = gpio.PWM(ps,50)
pitchS.start(0)
def Yservo(q, start_position):
command = None
x = start_position
while True:
try:
command = q.get(False)
except Queue.Empty:
pass
if command == "turn_right" and x < 100:
x += 1
pitchS.ChangeDutyCycle(x)
time.sleep(1)
print(x)
q = Queue()
TS = Process(target=Yservo,args=(q,start_position))
TS.daemon = True
TS.start()
try:
while True:
dataFromClient, address = server_socket.recvfrom(256)
data = str(dataFromClient.decode('utf-8'))
data = data.split(',')
if data[0] == 'turnRight':
q.put("turn_right")
if data[0] == 'stop':
q.put("stop")
except:
print('STOP! wait a minute')
TS.terminate()
TS.join()
q.get()
将阻止代码的执行,但是通过传递False
布尔值并捕获Queue.Empty
异常,您可以尝试以非阻塞方式使用队列中的对象。
推荐阅读
- coldfusion - ColdFusion 列表值替换
- typescript - 用空的 Promise 替换 http 调用
- django - UserProfile db 在 django 中显示(无)
- html - 如何将 UI 简单下拉列表转换为可点击?
- linux - Bash 函数忽略 set -e
- python - Python压缩字符串不太正确
- vue.js - 如何对所有元素使用相同的插槽元素?
- django - 在 django rest 中仅允许特定用户(即创建该模型的用户)访问视图
- php - 未定义索引:密码 Laravel 5.5 - 日志记录
- python - 未找到(状态代码:404):未知消息