如何解决类变量返回两个不同的值?
无论出于何种原因,我的程序为我的变量 server.speed
返回两个不同的值,具体取决于它从哪个函数运行。
这里我有两个函数,loop() 和 update(),它们与多处理库异步运行。
import sys
from time import sleep
from requests import get
from multiprocessing import Process
class Server:
"""
Fetches speed from server
"""
def __init__(self,url,port):
self.url = url
if "http" not in url:
self.url = "http://" + url
self.port = port
self.speed = 0
def getSpeed(self):
""" Gets speed from specified url and port by get request."""
r = get(
f"{self.url}:{self.port}/get"
)
self.speed = float(r.text)
return self.speed
class Timings:
"""
Calculations for ratio timings.
"""
def __init__(self,speed,hz):
self.hz = hz
self.ratio = speed
def on_time(self):
""" Calculates pulse duration of pwm."""
if self.ratio == 0 or self.ratio == 1:
return self.ratio
return self.seconds(self.hz - (self.hz * self.ratio))
def off_time(self):
""" Calculates un-powered duration of pwm."""
if self.ratio == 0:
return 1
elif self.ratio == 1:
return 0
else:
return self.seconds(self.hz * self.ratio)
def update(self,ratio):
""" Updates ratio in class.
Args:
ratio::float
The ratio in decimal form of which to update.
"""
self.ratio = ratio
def seconds(self,hz):
""" Converts hz into seconds.
Args:
hz::float
The number of hz to be translated to seconds.
Returns:
secons::float
The number of seconds calculated from hz imput.
"""
return 1/hz
def loop():
""" Creates a duty cycle depending on downloaded ratio."""
while 1:
print(f"\
loop: {server.speed}\n\
")
pin.on() #from different class that I'm leaving out for this example
sleep(pwm.on_time())
pin.off()
sleep(pwm.off_time())
pwm.update(server.speed)
def update():
""" Updates speed asynchronously."""
while 1:
server.getSpeed()
print(f"\
update: {server.speed}
")
if __name__=='__main__':
"""Only executes if is being run as main.
Runs two functions async as to not delay and/or disrupt the
pulses and to aquire faster data from server.
"""
p1 = Process(target = loop)
p2 = Process(target = update)
p2.start()
p1.start()
我让程序在两个函数中都打印出 server.speed
。起初,它们都可以工作,但是一旦服务器上的速度改变,只有update()
会改变。这将产生如下输出:
loop: 0.2
update: 0.2
update: 0.2
update: 0.2
#server updates
update: 0.3
update: 0.3
update: 0.3
update: 0.3
loop: 0.2
update: 0.3
update: 0.3
update: 0.3
update: 0.3
update: 0.3
update: 0.3
update: 0.3
loop: 0.2
speed.server()
不会在 loop()
中更新。我试过使用全局变量,但同样的事情发生了。同样,它们应该打印相同的值,因为它们都打印 server.speed
。如果有帮助,这里是完整的代码。
import sys
from time import sleep
#import RPi.GPIO as GPIO #Commented for running on Mac for development
from requests import get
from multiprocessing import Process
class Server:
"""
Fetches speed from server
"""
def __init__(self,hz):
""" Converts hz into seconds.
Args:
hz::float
The number of hz to be translated to seconds.
Returns:
secons::float
The number of seconds calculated from hz imput.
"""
return 1/hz
class PiControl:
"""
Control for pinout. Also simple command-line gui.
"""
def __init__(self,pin):
self.pin = pin
#GPIO.setmode(GPIO.BCM)
#GPIO.setup(self.pin,)
def on(self):
""" Turns on the GPIO port and displayes a rectangle."""
#GPIO.output(self.pin,1)
print("████████████",end="\r")
def off(self):
""" Turns off the GPIO port and erases any prevIoUs rectangle"""
#GPIO.output(self.pin,0)
print(" ",end="\r")
#Check for command line args
try:
server = Server(sys.argv[2],sys.argv[3])
pwm = Timings(server.getSpeed(),float(sys.argv[1]))
except IndexError:
#If no args
print("""\
pwm.py: python3 pwm.py [hz] [url] [port] [pin]
hz: Number of toggles per second
url: url to get speed from
port: port of url
pin: Optional - pin num for pi. Default = 3
""")
exit()
#Checks for any pin input,defaults to 3
try:
pin = PiControl(sys.argv[4])
except IndexError:
pin = PiControl(3)
def loop():
""" Creates a duty cycle depending on downloaded ratio"""
while 1:
print(f"\
loop: {server.speed}\
")
pin.on()
sleep(pwm.on_time())
pin.off()
sleep(pwm.off_time())
pwm.update(server.speed)
def update():
""" Updates speed asynchronously."""
while 1:
server.getSpeed()
print(f"\
update: {server.speed}\
")
if __name__=='__main__':
"""Only executes if is being run as main.
Runs two functions async as to not delay and/or disrupt the
pulses and to aquire faster data from server.
"""
p1 = Process(target = loop)
p2 = Process(target = update)
p2.start()
p1.start()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。