跳转到主要内容

Karoo阵列望远镜 - 望远镜状态客户端

项目描述

MeerKAT科学数据处理望远镜状态

这是一个客户端包,允许连接到存储MeerKAT射电望远镜科学数据处理望远镜状态信息的数据库。该数据库通常称为telstate

望远镜状态是一个键值存储。存在三种类型的键

不可变(也称为 属性

存储一个单值,一旦设置就不允许改变。

可变(也称为 传感器

存储多个带时间戳的值,组织成一个有序集合。

索引

存储一个键值对的字典,每个键值对的行为都像一个不可变键。这有助于避免主键空间变得过大。它还支持一些模式,例如增量存储值但一次性检索所有值。此外,它允许使用比字符串更通用的键。

键是字符串,值(以及索引键的子键)是经过 MessagePack 序列化的 Python 对象,MessagePack 已扩展以支持元组、复数和 NumPy 数组。旧版本的数据库将值存储为 pickles,并且该包会警告用户如果那样的话。可以使用属性语法或字典语法从 telstate 对象中检索键。

数据库可以通过两种后端之一进行访问:一个 Redis 客户端后端,它允许通过网络(或通过 fakeredis 模拟的服务器)共享访问实际的 Redis 服务器;以及一个简化内存后端,用于独立访问。两个后端都支持以 RDB 垃圾文件的形式加载和保存 Redis 快照。

可以对同一个数据库有多个 视图(每个 telstate 实例一个)。视图定义为作为命名空间的 前缀 列表,用于分组键。在从数据库读取时,将依次将每个前缀添加到键中,直到找到匹配项。在向数据库写入时,将第一个前缀添加到键中。因此,第一个前缀作为主命名空间,其余的作为补充只读命名空间。

入门

测试 katsdptelstate 最简单的方法是使用内存后端。如果您想运行实际的 Redis 服务器,您需要在网络上的一台合适的机器上安装 Redis(版本 4.0 或更高)。例如,这样做

  • macOS: brew install redis

  • Ubuntu: apt-get install redis-server

然后 pip install katsdptelstate 并运行本地 redis-server。如果您还想要加载 RDB 文件,请执行 pip install katsdptelstate[rdb]

一个简单的例子

import time
import katsdptelstate

# Connect to an actual Redis server via an endpoint or an URL
telstate = katsdptelstate.TelescopeState('localhost:6379')
telstate = katsdptelstate.TelescopeState('redis://localhost')
# Or use the in-memory backend (useful for testing)
telstate = katsdptelstate.TelescopeState()
# Load RDB file into Redis if katsdptelstate is installed with [rdb] option
telstate.load_from_file('dump.rdb')

# Attribute / dict style access returns the latest value
telstate.add('n_chans', 32768)
print(telstate.n_chans)  # -> 32768
print(telstate['n_chans'])  # -> 32768

# List all keys (attributes and sensors)
print(telstate.keys())  # -> ['n_chans']

# Sensors are timestamped underneath
st = time.time()
telstate.add('n_chans', 4096)
et = time.time()
telstate.add('n_chans', 16384)
# Time ranges can be used and are really fast
telstate.get_range('n_chans', st=st, et=et)  # -> [(4096, 1556112474.453495)]
# Add an item 10 seconds back
telstate.add('n_chans', 1024, ts=time.time() - 10)

# Attributes cannot be changed (only deleted)
telstate.add('no_change', 1234, immutable=True)
# Adding it again is OK as long as the value doesn't change
telstate.add('no_change', 1234, immutable=True)
# Simpler notation for setting attributes
telstate['no_change'] = 1234
# Will raise katsdptelstate.ImmutableKeyError
telstate['no_change'] = 456

# Create a new view with namespace 'ns' and standard underscore separator
view = telstate.view('ns')
# Insert a new attribute in this namespace and retrieve it
view['x'] = 1
print(view['x'])  # -> 1
print(view.prefixes)  # -> ('ns_', '')
print(view.keys())  # -> ['n_chans', 'no_change', 'ns_x']

异步接口

还有一个与 asyncio 一起工作的接口。使用 katsdptelstate.aio.TelescopeState 代替 katsdptelstate.TelescopeState。与数据库交互的函数现在是协程。需要 Python 3.6+。

与同步版本相比有一些差异,部分是由于 asyncio 的性质,部分是为了使代码更简洁和现代化

  • 构造函数只接受后端,不接受端点。下面是构建 redis 后端的示例。

  • 目前不支持读取或写入 RDB 文件;您需要创建一个连接到相同存储的同步望远镜状态客户端。

  • 不支持属性样式访问。

  • 支持以项目样式访问进行读取(await ts.get('key')),但不支持写入。使用 await ts.set('key', 'value') 代替以设置不可变键。

  • 而不是 key in ts,使用 await ts.exists(key)

  • wait_keywait_indexed 方法不接收超时或取消未来。它们可以与 asyncio 的取消机制一起使用。async-timeout 包在超时方面很有用。

  • 当不再需要时,应关闭后端以避免警告。

示例

from katsdptelstate.aio import TelescopeState
from katsdptelstate.aio.redis import RedisBackend

# Create a connection to localhost redis server
backend = await RedisBackend.from_url('redis://localhost')
ts = TelescopeState(backend)

# Store and retrieve some data
await ts.set('key', 'value')
print(await ts.get('key'))

# Close the connections (do not try to use ts after this)
ts.backend.close()
await ts.backend.wait_closed()

历史

0.14 (2024-02-28)

  • 改进内部类型提示 (#133)

  • 从 katsdpdockerbase 获取 lupa 版本(用于测试)(#134)

  • 修复在异常路径中在引用变量之前的情况 (#135)

  • 改进打开包含 pickles 的旧文件时的错误信息 (#136)

0.13 (2023-03-15)

  • 升级到 redis-py>=4.2 和 fakeredis>=2,修复测试警告 (#132)

  • 现在至少需要 Python 3.7,不再需要 aioredis

0.12 (2023-03-13)

  • 切换到 aioredis 2.x (#124)

  • 添加异步(和同步)RedisBackend.from_url 构造函数 (#125, #126)

  • 从 nose 切换到 pytest (#129)

  • 删除 Endpoint.multicast_subscribenetifaces 依赖 (#130)

  • 修复 set_indexed 的 Lua 脚本,以便 wait_indexed 实际上可以工作 (#127)

  • 使 aio wait_key 更健壮 (#128)

  • 常规清理 (#122, #123)

0.11 (2021-05-07)

  • 添加异步 RDBWriter 类 (#108)

  • 对于 get_range 使用事务而不是 Lua:服务器端更快 (#110)

  • 在池的标准连接上多路复用 aio pubsub (#113)

  • 需要 hiredis 以提高速度,并使用 aioredis<2 以提高兼容性 (#114, #118)

  • 改善 wait_keysMemoryBackend 的响应性 (#111, #116)

  • 避免在 telstate.clear 时阻塞 Redis 服务器 (#112)

  • 更新 Docker 镜像以使用 Redis 6.x 而不是 4.x (#109)

  • 在单元测试中支持旧的 HMSET Redis 命令 (#107)

  • 要求清理 (#115, #117, #119, #120)

0.10 (2020-05-25)

  • 删除 Python 2 支持。至少需要 Python 3.5。

  • 删除对旧版 redis-py 的支持 (#100)

  • 使用 redis-py 健康检查来提高健壮性 (#99)

  • 添加“索引”键 (#98)

  • 添加异步接口 (#103)

  • 在设置遮蔽方法的键时不再抛出 InvalidKeyError (#102)

  • 为 mypy 添加类型注释 (#101)

0.9 (2020-05-25)

  • 弃用 Python 2 支持:这是最后一个将支持 Python 2 的版本 (#94)

  • 删除从未使用的 get_messagesend_message (#89)

  • https://katsdptelstate.readthedocs.io 上发布文档 (#90)

  • 默认禁用 pickles 以提高安全性 (#92)

0.8 (2019-05-06)

  • 默认编码现在是 msgpack;在加载 pickles 时发出警告 (#75, #79)

  • 默认后端现在是内存型 (#76)

  • 添加将内存后端导出到 RDB 文件的能力 (#77)

  • 从 RDB 文件样对象和 Redis URL 构建 (#80, #82)

  • 将键和前缀报告给用户时作为字符串处理 (#73)

  • 添加 IPython 选项卡补全 (#83)

  • RDB 读取器和写入器清理 (#85, #86)

0.7 (2019-02-12)

  • 引入编码并添加 msgpack 编码作为 pickle 的替代方案 (#64, #65)

  • 引入后端并将内存后端作为 redis 的替代方案 (#71, #72)

  • 简化通过 __setitem__ 设置属性 (#68)

  • 内部键是字节,但允许指定为 unicode 字符串 (#63)

  • GitHub 存储库现在是公开的

0.6 (2018-05-10)

  • katsdptelstate 的第一个版本

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

katsdptelstate-0.14.tar.gz (71.5 kB 查看哈希值)

上传时间:

构建分发

katsdptelstate-0.14-py3-none-any.whl (83.5 kB 查看哈希值)

上传时间: Python 3

由...