录音文件识别调用示例中,提交转写任务后,等到转写结果的方法可能出现死循环的问题。Java SDK 和Python SDK的实现方式是一样的,这里以Java为例,在com.alibaba.dashscope.api.AsynchronousApi::wait中,else逻辑处理并没有超时设置,某些异常情况下可能会无限等待,占用资源:
|
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; |
|
} |
|
} |
录音文件识别调用示例中,提交转写任务后,等到转写结果的方法可能出现死循环的问题。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