-
Notifications
You must be signed in to change notification settings - Fork 21
Open
Description
录音文件识别调用示例中,提交转写任务后,等到转写结果的方法可能出现死循环的问题。Java SDK 和Python SDK的实现方式是一样的,这里以Java为例,在com.alibaba.dashscope.api.AsynchronousApi::wait中,else逻辑处理并没有超时设置,某些异常情况下可能会无限等待,占用资源:
dashscope-sdk-java/src/main/java/com/alibaba/dashscope/api/AsynchronousApi.java
Lines 100 to 133 in 6dfff23
| while (true) { | |
| try { | |
| DashScopeResult taskResult = client.send(req); | |
| JsonObject output = (JsonObject) taskResult.getOutput(); | |
| String taskStatus = | |
| output.get(TASK_STATUS) == null ? null : output.get(TASK_STATUS).getAsString(); | |
| if (TaskStatus.FAILED.getValue().equals(taskStatus) | |
| || TaskStatus.CANCELED.getValue().equals(taskStatus) | |
| || TaskStatus.UNKNOWN.getValue().equals(taskStatus)) { | |
| return taskResult; | |
| } else if (TaskStatus.SUCCEEDED.getValue().equals(taskStatus)) { | |
| return taskResult; | |
| } else { | |
| // we start by querying once every second, and double the query interval after | |
| // every 3(increment_steps) intervals, until we hit the max waiting interval of 5(seconds) | |
| // TODO: investigate if we can use long-poll (server side return immediately when ready) | |
| step += 1; | |
| if (waitMilliseconds < maxWaitMilliseconds && step % incrementSteps == 0) { | |
| waitMilliseconds = | |
| waitMilliseconds * 2 > maxWaitMilliseconds | |
| ? maxWaitMilliseconds | |
| : waitMilliseconds * 2; | |
| } | |
| try { | |
| Thread.sleep(waitMilliseconds); | |
| } catch (InterruptedException ignored) { | |
| } | |
| } | |
| } catch (ApiException e) { | |
| if (e.getStatus().getStatusCode() != HttpURLConnection.HTTP_UNAVAILABLE | |
| && e.getStatus().getStatusCode() != HttpURLConnection.HTTP_GATEWAY_TIMEOUT) { | |
| throw e; | |
| } | |
| } |
Metadata
Metadata
Assignees
Labels
No labels