加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python解释器中的后台线程暂停时间.sleep()

发布时间:2020-12-20 13:36:51 所属栏目:Python 来源:网络整理
导读:我们已经构建了一个自定义 python解释器,并且正在尝试创建一个函数来启动后台线程,该后台线程定期调用函数来获取传感器读数,然后将该读取存储在循环缓冲区内(使用最大长度的双端队列实现) ). 下面显示了我们实施的简化版本.我们面临的问题是,当我们从解释器
我们已经构建了一个自定义 python解释器,并且正在尝试创建一个函数来启动后台线程,该后台线程定期调用函数来获取传感器读数,然后将该读取存储在循环缓冲区内(使用最大长度的双端队列实现) ).

下面显示了我们实施的简化版本.我们面临的问题是,当我们从解释器调用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)

下面显示了解释器会话的转储,我们尝试运行后台线程并查看存储的数据 – 请注意,我们等待的时间远远超过读取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) – 如果我们删除它,那么缓冲区将很快填满值.任何人都可以告诉我们为什么会出现这个问题,以及我们如何解决它?

更新

我们通过将导入时间从循环内部移动到模块级来解决了这个问题.到目前为止,没有任何线索可以解决这个问题,但如果有人能够回答这个问题,那么就会接受这个答案.

解决方法

你在没有锁的情况下在两个线程之间共享一个可变值.

这实际上并不能保证是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,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读