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_key 和 wait_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_subscribe 和 netifaces 依赖 (#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_keys 对 MemoryBackend 的响应性 (#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_message 和 send_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 的第一个版本
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。