chronaxis.legacy.batch_worker
在隔离子进程按有限批次读取BLF,并按显式串行政策解码。
INIT仅加载DBC和公开字段元数据;每次pull_batch明确许可原帧条数与字节上限。 共用BLFRead按原序读取;默认all范围逐帧解码,strict/partial政策跳过非数据帧。 显式decode_frame_ids限制允许解码的ID,只有其中实际请求了字段的ID才调用 decode_serial_frame;纯常量触发帧不解码。按需模式在解码后立即只取INIT所需 字段,缺失键保持缺失;v3 READY确认这一投影策略。 原帧保留集合与解码集合独立,导出原始帧可保留全部帧而不解码无需求ID。 auto模式在原生消息ID不匹配时先跳过;仅source需要读其时间。selected/none目标 只保存必要身份与所需值;非原生消息沿完整原帧检查并计入新包的回退数量。 字节不足容纳下一条最大记录时先结束当前批,不提前读取再丢弃。真正StopIteration 可与最后批数据一起报告,子实际退出及资源回收仍由父确认。没有后台预读或pickle。
这是模块参考。日常调用先查公开API索引;下划线对象和嵌套函数供维护者查阅。签名来自固定源码,公开类构造签名经实际Python接口核对。
相关类型
LegacyDecodedFrame、RequiredCANFrame、RequiredDecodedFrame
对象导航
| 对象 | 用途 |
|---|---|
_requested_fields |
按固定报文ID整理所需信号名,不读取输入或遍历解码结果。 |
_project_values |
只读取本报文所需的原值,让后续完整模型只检查这些值。 |
_encode_fresh_packet |
编码本worker刚完成完整检查的记录,省去同一JSON树的再次遍历。 |
_limits |
验证本次批许可及解码后投影,非法许可不能推进旧读取器。 |
batch_worker_main |
处理一次独立批次会话,沿用原INIT、元数据和有限远端错误格式。 |
导入与重导出来源(展开)
from collections.abc import Mapping
from collections import Counter
from importlib import metadata
from math import isfinite
from ..dbc_loading import load_dbc_file
from . import worker
from .records import PROFILE_ID, MAX_WIRE_BYTES, LegacyDecodedFrame, decoded_to_dict, _decoded_values_size
from .batch_wire import HEADER, DEMAND_HEADER, LENGTH, MIN_BATCH_BYTES, MAX_BATCH_BYTES, MAX_BATCH_ROWS, FILE_HEADER, FILE_MAGIC, encode_batch
from .batch_validation import validate_discarded, _item_base_size
from .required_records import RequiredCANFrame, RequiredDecodedFrame, required_to_dict
from .decode_policy import decode_serial_frame as _parse_selected_requested_fields
按固定报文ID整理所需信号名,不读取输入或遍历解码结果。
_requested_fields(fields, decode_ids)参数
| 名称 | 数据类型 | 必填 | 省略时的值 | 用途、取值和效果 |
|---|---|---|---|---|
fields |
tuple[LegacyCANField, ...] | 是 | 无 | 位置或关键字。INIT已经检查的完整信号定位,每项确定报文及所需信号名称。 |
decode_ids |
frozenset[int] | 是 | 无 | 位置或关键字。本次需要解码的报文ID集合,不随每批数据改变。 |
返回说明
ID到去重信号名字典的有限映射,名字次序保持请求顺序。
异常说明
ValueError表示字段所在报文不在解码范围;原分配/取消错误直接传播。 父策略费用为每个字段另付1024B,覆盖此表及构建临时槽;名称借自原请求。
源码:src/chronaxis/legacy/batch_worker.py:40(行号属于 8904c2f744951857659abd40aaa3535d57faf53c)。
_project_values
只读取本报文所需的原值,让后续完整模型只检查这些值。
_project_values(values, names)参数
| 名称 | 数据类型 | 必填 | 省略时的值 | 用途、取值和效果 |
|---|---|---|---|---|
values |
Mapping | 是 | 无 | 位置或关键字。values为原parse返回值 |
names |
Mapping[str, object] | tuple | 是 | 无 | 位置或关键字。当前报文需要保留的信号名集合;没有所需名称时使用空元组,不输出其他信号值。 |
返回说明
新dict,保留实际存在的所需键;KeyError代表缺失,不补None或零。
异常说明
有字段需求时非Mapping报TypeError;所需键访问和取消错误原样传播。 无字段的常量触发报文直接返回空dict,不遍历或校验没有用途的原values。
源码:src/chronaxis/legacy/batch_worker.py:61(行号属于 8904c2f744951857659abd40aaa3535d57faf53c)。
_encode_fresh_packet
编码本worker刚完成完整检查的记录,省去同一JSON树的再次遍历。
_encode_fresh_packet(packet)参数
| 名称 | 数据类型 | 必填 | 省略时的值 | 用途、取值和效果 |
|---|---|---|---|---|
packet |
LegacyDecodedFrame | 是 | 无 | 位置或关键字。packet只能是紧邻LegacyDecodedFrame成功构造后由原decoded_to_dict生成的 私有dict |
返回说明
与公开encode_packet相同的UTF-8 bytes,不带换行。
异常说明
原JSON/UTF-8编码错误、实际超过65536字节的ValueError或原取消异常。 完整模型已检查全部帧字段、含ITEM外壳的长度及收到的Mapping两遍,再复制冻结数值; 原转换只生成固定字段与非有限数值标签。沿用原批许可费用,不保留跨记录状态。
源码:src/chronaxis/legacy/batch_worker.py:88(行号属于 8904c2f744951857659abd40aaa3535d57faf53c)。
_limits
验证本次批许可及解码后投影,非法许可不能推进旧读取器。
_limits(packet, frames_returned)参数
| 名称 | 数据类型 | 必填 | 省略时的值 | 用途、取值和效果 |
|---|---|---|---|---|
packet |
dict[str, object] | 是 | 无 | 位置或关键字。已经解码并检查字段的进程通信包,含op操作名及该操作的数据;本函数按当前协议步骤继续检查或发送它。 |
frames_returned |
int | 是 | 无 | 位置或关键字。此前已经返回的原始帧数,用于计算下一批的起始序号和剩余许可。 |
返回说明
(原帧上限,字节上限,保留ID集合或None)。
异常说明
TypeError/ValueError。
本函数直接报告的具体错误:
ValueError:批次许可必须按原帧序号连续。ValueError:批次许可条数或字节上限非法。ValueError:解码后保留ID必须是无重复29位整数列表或None。
源码:src/chronaxis/legacy/batch_worker.py:111(行号属于 8904c2f744951857659abd40aaa3535d57faf53c)。
batch_worker_main
处理一次独立批次会话,沿用原INIT、元数据和有限远端错误格式。
batch_worker_main(connection, *, decode_frame_ids=None, input_check='full', time_scope='source', input_paths=None, decode_policy='legacy', cycle_fields=(), metadata_fields=())参数
| 名称 | 数据类型 | 必填 | 省略时的值 | 用途、取值和效果 |
|---|---|---|---|---|
connection |
multiprocessing.connection.Connection | 是 | 无 | 位置或关键字。父子进程之间已经建立的双向通信端点,用于发送请求和接收结果;不是文件路径或网络地址。 |
decode_frame_ids |
tuple | None | 否 | None | 仅关键字。decode_frame_ids=None沿用全解码, 原生tuple明确本次固定解码ID,允许空集合 |
input_check |
str | 否 | 'full' | 仅关键字。"auto"按实际使用的报文和字段检查;"full"检查全部原始帧及时间。发送端与接收端必须使用同一次读取确认的设置。 |
time_scope |
str | 否 | 'source' | 仅关键字。"none"不收集时间范围;"selected"只收集选中记录的时间;"source"收集全部来源时间。发送端与接收端必须使用同一次读取确认的设置。full检查要求time_scope为source。 |
input_paths |
tuple[str, ...] | None | 否 | None | 仅关键字。有序且同格式的连续输入文件;按给定顺序读取,文件边界不中断计算状态。 |
decode_policy |
str | 否 | 'legacy' | 仅关键字。strict要求DBC长度一致,partial允许短载荷可解部分,legacy沿用旧格式路径;不接受未知取值。 |
cycle_fields |
tuple[LegacyCANField, ...] | 否 | () | 仅关键字。需要读取DBC周期的字段定位集合;初始化时读取元数据,不逐帧读取DBC。 |
metadata_fields |
tuple[LegacyCANField, ...] | 否 | () | 仅关键字。仅请求驱动信号的DBC候选声明,默认空tuple;用于确认实际帧身份,不请求信号值,也不增加普通样本或值解码。 |
返回说明
正常STOP或真实EOF时None。
异常说明
失败发送有限事实并以SystemExit(1)退出;清理副错不替代原错误。
本函数直接报告的具体错误:
ValueError:输入检查与时间范围必须匹配固定按需解码策略。ValueError:按需解码ID必须是无重复29位整数tuple。ValueError:未知批次控制操作。ValueError:全来源按需批次字节许可不足以容纳一条最大记录。ValueError:原报文timestamp需要有限float秒。
副作用说明
子进程内加载一次DBC,每个声明文件建立一个共用BLFRead,按原序取帧; 默认all解码全部帧,strict/partial跳过非数据帧;按需只解码固定集合中有字段需求的帧, 并立即投影所需字段。未解码帧不产生或检查 解码值,仍检查原帧;原始帧保留范围不扩大解码范围。 只关闭自己连接及同次共用读取器;第三方内部RSS仍不作硬上限保证。
源码:src/chronaxis/legacy/batch_worker.py:131(行号属于 8904c2f744951857659abd40aaa3535d57faf53c)。