gpt4 book ai didi

python - Python 解释器中的后台线程在 time.sleep() 上暂停

转载 作者:太空宇宙 更新时间:2023-11-03 11:53:56 26 4
gpt4 key购买 nike

我们已经构建了一个自定义的 python 解释器,并正在尝试创建一个函数来启动一个后台线程,该线程定期调用一个函数来获取传感器读数,然后将该读数存储在一个循环缓冲区中(使用 deque 和最大长度)。

下面显示了我们实现的简化版本。我们面临的问题是,当我们从解释器调用 monitor_sensor() 以启动后台线程时,后台线程中的代码似乎只执行一次(我们通过查看 sensor_values 的内容来确定)。此外,当我们尝试退出解释器(使用 exit() )时,解释器挂起并且永远不会退出。

import code
import collections
import threading

def get_sensor_reading():
return 5.0

sensor_values = {}

def monitor_sensor():
sensor_values['sensor_1'] = collections.deque(maxlen=1000)
background_thread = threading.Thread(target=run_monitor_sensor, args=[sensor_values, get_sensor_reading])
background_thread.start()

def run_monitor_sensor(sensor_values, read_sensor_cmd):
while True:
reading = read_sensor_cmd()
sensor_values['sensor_1'].append(reading)
import time
time.sleep(1)

imported_objects = {'monitor_sensor': monitor_sensor,
'sensor_values': sensor_values}

code.interact(local=imported_objects)

下面显示了解释器 session 的转储,我们在其中尝试运行后台线程并查看存储的数据 - 请注意,我们等待的时间远远超过尝试读取 sensor_values 中的值之间的 1 秒休眠。

218> python manage.py example
Python 2.7.3 (default, Aug 1 2012, 05:16:07)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> monitor_sensor()
>>> sensor_values
{'sensor_1': deque([5.0], maxlen=1000)}
>>> sensor_values
{'sensor_1': deque([5.0], maxlen=1000)}

问题看起来与对 time.sleep(1) 的调用有关 - 如果我们删除它,那么缓冲区将很快填满值。谁能告诉我们为什么会出现此问题,以及我们如何解决它?

更新

我们通过将 import time 从循环内部移动到模块级别解决了这个问题。到目前为止还不知道为什么这可以解决问题,但如果有人能回答这个问题,那么就会接受这个答案。

最佳答案

您在两个没有锁的线程之间共享一个可变值。

这实际上不是 保证 是 Python 中的问题,它可能不是你的问题......但它绝对是错误的,它可以导致这样的问题.

要修复它,请执行以下操作:

sensor_values = {}
sensor_lock = threading.Lock()

def monitor_sensor():
sensor_values['sensor_1'] = collections.deque(maxlen=1000)
background_thread = threading.Thread(target=run_monitor_sensor, args=[sensor_values, get_sensor_reading, sensor_lock])
background_thread.start()

def run_monitor_sensor(sensor_values, read_sensor_cmd, sensor_lock):
while True:
reading = read_sensor_cmd()
with sensor_lock:
sensor_values['sensor_1'].append(reading)
import time
time.sleep(1)

def get_sensor_values():
with sensor_lock:
return sensor_values

关于python - Python 解释器中的后台线程在 time.sleep() 上暂停,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18393148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com