多线程任务管理器
ExperimentManager
) 类,用于管理和运行实验队列中的任务。该管理器在一个工作线程中不断检查队列中的实验任务,并根据任务的优先级和状态来决定执行哪些实验。实验任务由测量、序列(或扫描)和运行组成,在执行实验时会调用相关的开始和结束函数来控制实验的流程。以下是该代码的详细中文文档说明:
代码概述
该代码实现了一个实验管理器 (ExperimentManager
) 类,用于管理和运行实验队列中的任务。该管理器在一个工作线程中不断检查队列中的实验任务,并根据任务的优先级和状态来决定执行哪些实验。实验任务由测量、序列(或扫描)和运行组成,在执行实验时会调用相关的开始和结束函数来控制实验的流程。
依赖库
numpy
:用于数值计算和数组操作。time
:用于时间操作和延时。PyQt6.QtCore
:用于信号槽机制和日期时间操作。balic.GUI.browser_workers
:包含Worker
类,用于多线程处理。balic.servers
:包含发送信息和错误的函数。
类 ExperimentManager
该类包含了管理实验任务队列的功能,包括运行实验、暂停实验、终止实验等。
初始化方法 __init__(self, browser=None)
初始化实验管理器,设置浏览器、属性、队列、线程池等,并启动实验队列。
参数:
browser
:浏览器对象,用于获取属性和队列。
运行实验方法 run(self, taskNr, progress_callback=None)
处理实验任务的运行逻辑。
参数:
taskNr
:任务编号。progress_callback
:进度回调函数。
内部方法 _sequence_run(self)
初始化运行循环并开始实验。
内部方法 _runloop(self)
运行实验(或实验扫描),在每次运行前检查实验是否暂停或终止。
暂停方法 pause(self)
暂停或继续实验。
启动队列方法 start_queue(self)
在实验线程中启动实验队列工作器。
队列函数 queue_fn(self, progress_callback=None)
实验队列持续检查实验字典中的新任务,如果字典为空或有实验在运行,则不做任何操作。
检查到期方法 due_check(taskDict)
检查任务是否到期。
参数:
taskDict
:任务字典。
返回:
True
或False
,表示任务是否到期。
更新表格方法 update_table(self)
通知 GUI 更新表格显示。
终止实验方法 terminate_experiment(self)
优雅地终止实验,允许当前运行完成。
开始测量方法 start_measurement(self)
设置参数并调用实验的 start_measurement
函数。
开始序列方法 start_sequence(self)
调用实验的 start_sequence
函数。
结束序列方法 end_sequence(self)
调用实验的 end_sequence
函数。
结束测量方法 end_measurement(self)
运行 end_measurement
函数,并清理表格。
设置字典方法 set_dict(self, name, value)
设置实验参数。
参数:
name
:参数名。value
:参数值。
设置运行编号方法 set_run_nr(self, value)
设置实验运行编号并更新表格。
参数:
value
:运行编号。
设置重复编号方法 set_rep_nr(self, value)
设置实验重复编号并更新表格。
参数:
value
:重复编号。
代码详细说明
初始化 ExperimentManager
在初始化方法中,实验管理器会从浏览器对象中获取属性和队列,并启动实验队列工作器。实验队列工作器会在一个单独的线程中运行,不断检查实验队列中的任务。
运行实验 run
在运行实验方法中,实验管理器会检查任务是否存在,并获取任务的详细信息,包括实验名、参数、扫描参数、扫描值等。然后调用相关的开始和结束方法来控制实验的流程。
队列函数 queue_fn
队列函数会持续检查实验字典中的新任务,并根据任务的优先级和状态来决定执行哪些实验。如果任务到期,则运行任务,否则继续检查下一个任务。
暂停和终止实验
实验管理器提供了暂停和终止实验的方法。暂停方法会切换实验的暂停状态,并更新队列显示。终止方法会优雅地终止实验,允许当前运行完成。
其他辅助方法
实验管理器还提供了一些辅助方法,用于设置实验参数、更新表格显示等。
代码示例
以下是一个简单的使用示例:
from PyQt6.QtWidgets import QApplication
import sys
from balic.servers import Properties
from balic.GUI.browser import Browser
from balic.GUI.experiment_manager import ExperimentManager
app = QApplication(sys.argv)
browser = Browser()
experiment_manager = ExperimentManager(browser)
# 添加实验任务到队列
experiment_manager.queue.add_task(task_dict)
# 开始运行实验
experiment_manager.run(taskNr)
sys.exit(app.exec())