FAQ > 金融建模 > 建模问题 > 其他

Q:极端情况下(超多多线程下同时写入),WriteToLog写入丢失    

  • A:在天软中,通过WriteFile进行多并发写入日志等操作时,无需考虑加锁问题,
    仅需要将位置设置为-1则可保障追加模式,如果调用失败,可检测返回值为字符串后然后重试即可。(当多线程尝试打开同一个文件写入时会返回错误)

    为保障每一次写入不丢失,WriteToLog模型中对于多线程写采取了失败重试的容错,但是在极端情况下(超多多线程,上百个线程),可能会写入失败。
    此时用户可以根据返回的错误信息,对内容再次写入。

    一般处理逻辑:
    通过WriteToLog返回内容是否成功。
    返回1,即写入成功。
    返回数组,即写入失败,数组第一项为失败信息,第二项为上次写入的失败的日志内容。
    重新写入数据示例(下面示例都是以本地运行为例,若客户端中运行,需要加上rdo2):
    SubDir:="E:\\testLog\\test-";
    a:=WriteToLog("",SubDir,"test");
    //写入失败时,返回结果不等于1
    if a<>1 then
    begin
      echo "WriteToLog-异常:"$a[0];
      //重新写入数据
      a:=WriteToLog("",SubDir,"重写:"$a[1]);
    end;
    return a;


    完整代码范例:
    SubDir:="E:\\testLog\\test-";
    r:=array();
    k:=0;
    //多线程写日志场景模拟,10个线程同时写日志。
    for i:=1 to 10 do
    begin
      r[k++]:=#WriteToLog("",SubDir,'AAA-'$i);
    end;
    sleep(2*1000);//等待2秒,等待并发处理完成,避免继续竞争资源
    //获取处理结果,若写入失败的,则重新写入
    n:=0;
    t:=array();
    for j:=0 to length(r)-1 do
    begin
      //等待返回
      a:=dupvalue(r[j]);
      //写入失败时,处理
      if a<>1 then
      begin
        echo "WriteToLog-异常:"$a[0];
        a:=WriteToLog("",SubDir,"重写:"$a[1]);
        t[n++]:=a;
      end;
    end;
    return t;