清理健身房环境中的传感器数据

问题描述 投票:0回答:1

我有一个强化学习程序,它使用 OpenAIgym 模块来创建环境。我从传感器获取数据,RL问题是基于传感器数据的,RL问题不是这个问题的主要焦点,我想在程序完成后保存所有传感器数据,根据OpenAI Gym文档

 Environments will automatically close() themselves when garbage collected or when the program exits.
。所以我想我可以在这个函数中将所有数据写入一个文件,但它从未被调用。

这是我的环境的代码,仍在进行中,但这不是这个问题的重点

class StressEnvironment(gym.Env):
    def __init__(self, images) -> None:
        super().__init__()
        self.images = images
        self.sensor = Sensor()
        self.observation_space = spaces.Box(low=np.array([0], dtype=np.float32),high=np.array([100],dtype=np.float32),shape=(1,))
        self.thread = threading.Thread(target=self.sensor.main)
        self.thread.start()

    def step(self, action):
        #TODO execute action
        new_state = np.array([self.sensor.breathing_rate])
        reward = -self.sensor.breathing_rate
        return new_state,reward,False, {}
    
    def reset(self):
        return np.array([self.sensor.breathing_rate])
    
    def close(self):
        # save sensor data to file
        print("saving sensor data to file")
        print(len(self.sensor.data))

这是我的 main.py

from environment import StressEnvironment

env = StressEnvironment([])

我也无法使用 Ctrl+C 杀死我的终端,这是由具有无限循环的线程引起的(只是一直收集传感器数据)。

所以我的问题是为什么没有调用 close() 以及我使用这个线程的方式好不好?

python multithreading reinforcement-learning openai-gym
1个回答
0
投票

您面临的问题似乎与您的 StressEnvironment 类的 close() 方法未被自动调用有关。 OpenAI Gym 环境中的 close() 方法通常用于在环境关闭之前清理资源并执行任何必要的操作。在您的情况下,您希望在环境关闭时将传感器数据保存到文件中。

要解决此问题,您可以在使用完环境后显式调用 close() 方法。以下是修改 main.py 以确保调用 close() 方法的方法:


from environment import StressEnvironment

env = StressEnvironment([])

# Your RL program here

# When you're done using the environment, call close
env.close()

通过显式调用 env.close(),您可以确保执行 close() 方法,并且可以将传感器数据保存到您已经实现的 close() 方法中的文件中。

关于线程的使用,异步收集传感器数据似乎是合理的。但是,请记住,如果您想使用 Ctrl+C 优雅地退出程序,则应该添加一种机制,以便在收到终止信号时停止线程。您可以使用标志或事件来通知线程在程序退出时正常停止。这样,您就可以避免强制终止程序。

以下是如何修改代码以处理 Ctrl+C 并正常停止线程的示例:

import signal

# Define a flag to signal the thread to stop
stop_thread = False

def signal_handler(sig, frame):
    global stop_thread
    stop_thread = True

# Set up a signal handler for Ctrl+C
signal.signal(signal.SIGINT, signal_handler)

from environment import StressEnvironment

env = StressEnvironment([])

# Your RL program here

# When you're done or when Ctrl+C is pressed, stop the thread and close the environment
stop_thread = True  # Signal the thread to stop
env.close()  # Close the environment

此修改允许您通过在退出程序之前停止线程并关闭环境来优雅地处理 Ctrl+C。

© www.soinside.com 2019 - 2024. All rights reserved.