hello!I am confused about how to realize Real-time data storage,we do like this:

from artiq.experiment import *
import numpy as np
import os
import time

class Run2(EnvExperiment):
"""test zeeman2.3"""
def build(self):


    self.setattr_device("core")
    self.setattr_device("ttl0")
    self.setattr_device("ttl1")
    self.setattr_device("ttl2")
    self.setattr_device("ttl4")
    self.setattr_device("ttl6")
    self.setattr_device("ttl8")
    self.setattr_device("ttl10")
    self.setattr_device("ttl12")
    self.setattr_device("ttl14")
    self.setattr_device("ttl16")
    self.setattr_device("ttl18")
    self.setattr_device("ttl20")
    self.setattr_device("ttl22")
    self.setattr_device("ttl24")
    self.setattr_device("ttl26")
    self.setattr_device("ttl28")
    self.setattr_device("ttl30")
    self.setattr_device("ttl32")
    self.setattr_device("urukul2_ch1")
    self.setattr_device("urukul2_ch2")
    self.setattr_device("urukul2_cpld")#定义设备
    
def prepare(self):

    self.parameter=self.get_dataset("para")
    #self.Rabi_Start=self.get_dataset("Run_Uint.Rabi.Start")
    #self.Rabi_End=self.get_datase================================================m'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'm'mt("Run_Uint.Rabi.End")
    #.Rabi_Step=self.get_dataset("Run_Uint.Rabi.Step")
    self.Zeeman_Frequency=self.get_dataset("Run_Uint.Zeeman.Start")
    self.Zeeman_Frequency_End=self.get_dataset("Run_Uint.Zeeman.End")
    self.Zeeman_Frequency_Step=self.get_dataset("Run_Uint.Zeeman.Step")
    #self.Zeeman_Repeat=self.get_dataset("Run_Uint.Zeeman.Repeat")
    #self.Zeeman_Threshould=self.get_dataset("Run_Uint.Zeeman.Threshould")
    #self.Rabi_Threshould=self.get_dataset("Run_Uint.Rabi.Threshould")

    #self.Preparation_Frequency=self.get_dataset("Run_Uint.Preparation.Frequency")
    #self.Preparation_Attenuation=self.get_dataset("Run_Uint.Preparation.Attenuation")
    #self.Zeeman_Attenuation=self.get_dataset("Run_Uint.Zeeman.Attenuation")

    self.length=int((self.Zeeman_Frequency_End-self.Zeeman_Frequency)/(self.Zeeman_Frequency_Step/1000))+1
    
    
@kernel
def run(self):
    print(66)
    self.core.reset()

    #刷新时间轴防止报错
    delay(2*ms)
    self.urukul2_cpld.init()
    self.urukul2_ch2.init()
    self.urukul2_ch1.init()
    self.urukul2_ch2.sw.on()#控制729的三种光频率与三种功率
    self.urukul2_ch1.sw.on()
    self.ttl2.input()
    self.ttl1.input()
    self.ttl0.input()
    self.ttl4.output()
    self.ttl6.output()
    self.ttl8.output()
    self.ttl10.output()
    self.ttl18.output()
    self.ttl12.output()
    self.ttl14.output()
    self.ttl16.output()
    self.ttl20.output()
    self.ttl22.output()
    delay(50*ms)

    print("ok1")



    #self.urukul0_ch0.set(self.Preparation_Frequency*MHz)             #设置729态制备频率
    #self.urukul0_ch0.set_att(self.Preparation_Attenuation)              #设置729态制备功率
    #self.urukul0_ch1.set_att(self.Zeeman_Attenuation)                   #设置729扫Zeeman功率

    #delay(50*ms)

    if self.parameter==2:
        self.length=int((self.Zeeman_Frequency_End- 

self.Zeeman_Frequency)/(self.Zeeman_Frequency_Step/1000))


        self.set_dataset("FrequncyList", np.full(self.length, np.nan), broadcast=True)
        self.set_dataset("D_List", np.full(self.length, np.nan), broadcast=True)
        
        self.set_dataset("Data", np.full(self.length, np.nan), broadcast=True)
        
        delay(15*ms)
        
        print(self.Zeeman_Frequency)
        print(self.Zeeman_Frequency_End)
        print(self.Zeeman_Frequency_Step/1000)
        
        

        t=0
        
        while self.Zeeman_Frequency<self.Zeeman_Frequency_End:
            
            #print(self.Zeeman_Frequency)
            
            delay(200*ms)
            self.urukul2_ch1.set(self.Zeeman_Frequency*MHz)
            self.urukul2_ch1.set_att(4.0)
            delay(5*ms)
            a=0
            delay(5*ms)
            
            #print(1)
            for i in range(1000):
                #try:
                    
                print('ok')
                t_end=self.ttl1.gate_rising(20*ms)#从当前时刻开始记录上升沿,直到括号内的时间为止。
                t_edge=self.ttl1.timestamp_mu(t_end) 
                
                
                    #rtio = self.core.get_rtio_counter_mu()
                    #now = now_mu()
                    #print(rtio-now)
                if t_edge>0:#如果探测到触发信号的上
                
                    at_mu(t_edge)
                    delay(7*ms)
                    print(t_edge)
                    
                    self.ttl20.off()#打开397Double pass                            
                    self.ttl4.off()#打开大功率AOM
                    self.ttl8.on()#打开397-Z-小功率-Doppler cooling
                    self.ttl10.on()#关闭397-x&y-Doppler cooling
                    delay(2*ms)
                    self.ttl20.on()#关闭397Double pass 
                    self.ttl8.off()#打开397-z-大功率-态探测
                    self.ttl6.on()#关闭854Double pass
                    self.ttl22.on()#关闭854小功率
                    self.ttl18.off()#打开729Double Pass的AOM
                    delay(2*ms)
                    self.ttl18.on()#关闭729Double Pass的AOM
                    self.ttl20.off()#打开397Double Pass的AOM
                    self.ttl10.off()#打开397--x&y的AOM 
                    
                                           
                    gate_end_mu = self.ttl0.gate_rising(5700*us)
                        #记录探测时长内的上升沿并计数
                    delay(3.5*ms)
                    num_rising_edges=self.ttl0.count(gate_end_mu)
                    
                    self.set_dataset("Photon_Count",num_rising_edges, broadcast=True)
                    
                    self.ttl6.off()#打开854-Double pass
                    self.ttl22.off()#打开854大功率

                 
                    if num_rising_edges>0:
                        a+=1
                   
                    #self.core.reset()
                    #self.core.wait_until_mu(now_mu())
                    
                    delay(1*ms)


                #except RTIOUnderflow:
        #时间溢出报错时会打印"Error for time"
                    #print("Error for time")
                    
            self.ttl20.off()#打开397Double pass 
            self.ttl10.off()#打开397--x&y的AOM         
            self.ttl6.off()#打开854-Double pass
            self.ttl22.off()#打开854大功率        
            
            
            D=1-a/100
            
            self.mutate_dataset("FrequncyList", t, self.Zeeman_Frequency)
            self.mutate_dataset("D_List", t, D)
            
            t+=1
            
            self.Zeeman_Frequency+=self.Zeeman_Frequency_Step/1000

def analyze(self):

    try:
        name=time.strftime("%F")
        filename="E:/data/"+str(name) 
        os.mkdir(filename)
    except:
        pass
        
    D_List=self.get_dataset("D_List")
    FrequncyList=self.get_dataset("FrequncyList")
    
    
    name1=time.strftime("%H-%M-%S")+"-Zeeman"
    filename1=filename+"/"+str(name1)
    
    file=open(filename1+".txt","a")
    str4="Fre"
    str5="Jump"
    str6=str4+"     "+str5+"\n"
    file.write(str6)
    for i in range(self.length):
        str1=str(D_List[i])
        str2=str(FrequncyList[i])
        str3=str2+"     "+str1+"\n"
        file.write(str3)
    
    file.close()

we add the code part to the end of our experimental code,but it can only be carried out when all the experimental cycles are completed,how can we realize real-time data storage,i.e one data gained in one cycle can be storaged in one cycle?

Please format your forum post correctly, and also minimize your code.