python - 为什么我的两个 while 循环不能同时运行?
问题描述
我对编码和东西很陌生。我正在使用带有 HX711 分线板的数字称重秤,并通过 4 位 7 段显示器输出值。
weighing()
循环读取值的速度比我的显示多路复用时间慢,因此代码在读取值之前不会继续,导致显示像地狱一样闪烁。所以我尝试通过同时运行weighing()
循环和displaying()
循环concurrent.futures
。但是代码只会执行weighing()
一次然后卡在display()
循环中,所以它们没有同时运行?
我的代码一定有问题,请帮助我澄清并留下任何其他方法的建议。
import time
import RPi.GPIO as GPIO
import concurrent.futures
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
segments = [2, 3, 4, 5, 6, 7, 8, 9]
digits = [12, 13, 18, 19]
GPIO.setup(segments, GPIO.OUT)
GPIO.output(segments, GPIO.HIGH)
GPIO.setup(digits, GPIO.OUT)
GPIO.output(digits, GPIO.LOW)
nums ={
0:(1,1,1,1,1,1,0),
1:(0,1,1,0,0,0,0),
2:(1,1,0,1,1,0,1),
3:(1,1,1,1,0,0,1),
4:(0,1,1,0,0,1,1),
5:(1,0,1,1,0,1,1),
6:(1,0,1,1,1,1,1),
7:(1,1,1,0,0,0,0),
8:(1,1,1,1,1,1,1),
9:(1,1,1,1,0,1,1)}
switchpolarity = {1: 0,
0:1}
def display(value):
while 1:
s = [int(d) for d in str(value)]
for digit in range(0,len(s)):
for segment in range(0,7):
GPIO.output(segments[segment], switchpolarity[nums[s[digit]][segment]])
GPIO.output(digits[digit], 1)
time.sleep(0.01)
GPIO.output(digits[digit], 0)
EMULATE_HX711=False
if not EMULATE_HX711:
from hx711 import HX711
else:
from emulated_hx711 import HX711
def weighing():
while 1:
val = round(abs(hx.get_weight(1)))
print(val)
hx.power_down()
hx.power_up()
return(val)
hx = HX711(9, 10)
hx.set_reading_format("MSB", "MSB")
hx.set_reference_unit(754)
hx.reset()
hx.tare()
print("Tare done! Add weight now...")
try:
with concurrent.futures.ProcessPoolExecutor() as executor:
weighing = executor.submit(weighing)
displaying = executor.submit(display, (t1.result()))
except(KeyboardInterrupt):
GPIO.cleanup()
对于我发布的代码中的拼写错误,我感到非常抱歉,我在没有测试的情况下更改了进程名称。这是我的新代码,我可以说没有愚蠢的错误:
import time
import RPi.GPIO as GPIO
import concurrent.futures
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
segments = [2, 3, 4, 5, 6, 7, 8, 9]
digits = [12, 13, 18, 19]
GPIO.setup(segments, GPIO.OUT)
GPIO.output(segments, GPIO.HIGH)
GPIO.setup(digits, GPIO.OUT)
GPIO.output(digits, GPIO.LOW)
nums ={
0:(1,1,1,1,1,1,0),
1:(0,1,1,0,0,0,0),
2:(1,1,0,1,1,0,1),
3:(1,1,1,1,0,0,1),
4:(0,1,1,0,0,1,1),
5:(1,0,1,1,0,1,1),
6:(1,0,1,1,1,1,1),
7:(1,1,1,0,0,0,0),
8:(1,1,1,1,1,1,1),
9:(1,1,1,1,0,1,1)}
switchpolarity = {1: 0,
0:1}
def display(value):
while 1:
s = [int(d) for d in str(value)]
for digit in range(0,len(s)):
for segment in range(0,7):
GPIO.output(segments[segment], switchpolarity[nums[s[digit]][segment]])
GPIO.output(digits[digit], 1)
time.sleep(0.01)
GPIO.output(digits[digit], 0)
EMULATE_HX711=False
if not EMULATE_HX711:
from hx711 import HX711
else:
from emulated_hx711 import HX711
def weighing():
while 1:
val = round(abs(hx.get_weight(1)))
print(val)
hx.power_down()
hx.power_up()
return(val)
hx = HX711(9, 10)
hx.set_reading_format("MSB", "MSB")
hx.set_reference_unit(754)
hx.reset()
hx.tare()
print("Tare done! Add weight now...")
try:
with concurrent.futures.ProcessPoolExecutor() as executor:
weighing1 = executor.submit(weighing)
displaying1 = executor.submit(display, (weighing1.result()))
except(KeyboardInterrupt):
GPIO.cleanup()
解决方案
这是您的“称重”线程的主要功能:
def weighing():
while 1:
val = round(abs(hx.get_weight(1)))
...
return(val)
该return(val)
语句将导致函数在循环的第一次迭代结束时返回。一旦函数返回,线程就结束了。它永远不会再次运行。
这是您启动线程的方式:
weighing = executor.submit(weighing)
displaying = executor.submit(display, (t1.result()))
如果我理解正确,*executor.submit(weighing)
调用返回一个future,而t1.result()
**等待未来的完成,然后返回weighing
函数返回的任何值。
这意味着,executor.submit(display, ...)
直到返回一个值才会发生t1.result()
,这意味着在第一个线程完成之前,第二个线程甚至无法启动。
海事组织;
您的
weighing()
函数应该更新一个全局变量并永远继续循环而不是返回一个值,并且您的
display()
函数应该通过从全局变量中复制来获取它显示的值,并且您可以忽略
ProcessPoolExecutor
. 您并没有真正将其用作执行程序服务:您只是将其用作创建两个线程的一种方式。
* 我实际上不是 Python 大师。
** 我假设这t1.result()
是一个复制/粘贴错误,你的意思是说weighing.result()
.
推荐阅读
- alfresco - 露天 Pgadmin4
- tensorflow - Tensorflow:从 Python 保存 Keras 模型并从 C++ 加载它
- swift - 使用组合防止并发
- localization - 是否可以让 ClickOnce Bootstrapper 根据 PC 区域设置选择语言?
- css - 匹配 srcset 和媒体查询
- java - 用java覆盖tomcat模块化项目中的库的正确方法
- javascript - vue 2.6项目中如何使用es2020特性?
- flutter - 如何在 Riverpod 中管理 Firebase 身份验证?
- c++ - 取消绑定时的回显命令不适用于 sudo,“权限被拒绝”
- tags - 删除动态生成的广告