Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python进程中的变量更新_Python_Python Multiprocessing - Fatal编程技术网

python进程中的变量更新

python进程中的变量更新,python,python-multiprocessing,Python,Python Multiprocessing,我正在使用套接字将命令从一个RPi发送到另一个RPi。接收rpi在接收到“右转”命令时转动伺服(通过运行Yservo功能),并在接收到“停止”命令时终止该过程,从而停止转动伺服。伺服位置从x=50的一半开始。问题在于主代码中的伺服位置未更新,因此下一次运行该过程时,它将再次从50开始 我需要更新/更改python进程中的一个值(让Yservo中断它的while循环。例如while state==True:,因此当状态更新为false时,while循环中断并返回值x,而不是终止进程),或者让进程更

我正在使用套接字将命令从一个RPi发送到另一个RPi。接收rpi在接收到“右转”命令时转动伺服(通过运行Yservo功能),并在接收到“停止”命令时终止该过程,从而停止转动伺服。伺服位置从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()


我建议您让您的流程保持活动状态,或者每次生成/杀死它,并让它每1s侦听一个队列以从主流程获取命令。如果
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()
导入套接字
从多处理导入进程,队列
将RPi.GPIO导入为GPIO
导入时间
导入队列
gpio.setmode(gpio.BCM)
起始位置=50
ps=27
ys=28
gpio.setup(ps、gpio.OUT)
gpio.setup(ys,gpio.OUT)
俯仰=gpio.PWM(ps,50)
俯仰。开始(0)
def Yservo(q,启动位置):
命令=无
x=开始位置
尽管如此:
尝试:
command=q.get(False)
队列除外。空:
通过
如果命令==“右转”且x<100:
x+=1
变桨周期(x)
时间。睡眠(1)
打印(x)
q=队列()
TS=过程(目标=Yservo,参数=(q,起始位置))
TS.daemon=True
TS.开始()
尝试:
尽管如此:
dataFromClient,address=server\u socket.recvfrom(256)
data=str(dataFromClient.decode('utf-8'))
data=data.split(',')
如果数据[0]=“右转”:
q、 put(“右转”)
如果数据[0]=“停止”:
q、 放置(“停止”)
除:
打印('停止!等一下')
终止
加入

q.get()
将阻止代码的执行,但通过传递
False
布尔值并捕获
队列.Empty
异常,您可以尝试以非阻塞方式使用队列中的对象。

我想到了一个更简单的解决方案。我将值X写入了Yservo中的一个文件。然后读取主循环中要更新X的值。确定。。。但这并不是解决这个简单问题的一种非常优雅的方式:)