项目实训(十六)---异步调用算法

2021SC@SDUSC

目录

一.问题提出

二.实现方法

1.准备工作

2.实现思路


一.问题提出

这里在实现的时候发现,服务器和安卓端在等待算法执行结束的漫长时间中,用户长时间只能等在一个界面中,体验感也会很差,因此选择异步通知的方式,用户开始处理视频后,直接返回主页面,在处理列表中,可以看到视频处理情况,不需要一直在等待界面中停留,体验感会大大提升。

二.实现方法

1.准备工作

我们发现,在用户请求接口后,直接断开,服务器这里是不会感知的,并且会继续执行完算法:

由于http是基于tcp的,在tcp中,客户端中断了连接,服务端是无法感知的,只能通过发心跳包来检测,而我们是没有发心跳包的,所以是不知道客户端已断开,而且web服务器也都没做这种中断机制,所以服务器依然会把客户端的请求走完。这就不用担心用户断开后,算法能否正常执行了。

测试代码:

<?php

$file = 'test-close.txt';

while(true){
	file_put_contents($file, date('Y-m-d H:i:s').PHP_EOL, FILE_APPEND);
	sleep(1);
}

在浏览器中访问

http://192.168.10.200/test.php

然后关掉这个请求

tail -f test-close.txt

可以看到,依然在不断写入,连接关闭5分钟后,仍然后端不停止工作。


2.实现思路

在实现过程中,我们在后端设置一个标记文件,只要算法执行结束,会在后台生成一个标志文件,前端会轮询向后端发送请求,询问是否处理完,后端根据tag标记来给前端返回是否剪辑完成的通知。tag使用id+视频名字判断是否冲突。

@RestController
@SpringBootApplication
public class callAlgorithmController {
    @PostMapping("/callAlgorithm")
    public void chunkUpload(String id,String name) throws IOException {

        //传视频
        System.out.print("F:/demo/temp/del_video/"+id+"_"+name);
        System.out.print(id);
        System.out.print(name);
        upload("F:/demo/temp/del_video/"+id+"_"+name+".mp4",id,id+"_"+name);

        //调用算法
       call_three_algorithm(id,id+"_"+id+"_"+name,id+"_"+name+".mp4");

        //生成标志
        File f=new File("F:\\demo\\temp\\Tag\\"+id+"_"+name+".txt");
        if(f.exists())
        {

        }else{
        f.createNewFile();
        }

    }
}
package com.example.demo;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;

@RestController
@SpringBootApplication
public class sceneTagController {
    @PostMapping("/ifSceneFinished")
    public String chunkUpload(String id,String name){
        File f=new File("F:\\demo\\temp\\SceneTag\\"+id+"_"+name+".txt");
        if(f.exists())
        {
            return "1";

        }else{

            return "0";
        }
    }
}
package com.example.demo;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;

@RestController
@SpringBootApplication
public class TagController {
    @PostMapping("/ifFinished")
    public String chunkUpload(String id,String name){
        File f=new File("F:\\demo\\temp\\Tag\\"+id+"_"+name+".txt");
        if(f.exists())
        {
              return "1";

        }else{

            return "0";
        }
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值