多线程任务管理器

该代码实现了一个实验管理器 (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:任务字典。

返回:

  • TrueFalse,表示任务是否到期。

更新表格方法 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())