#!/bin/bash # 并发控制测试脚本 set -e BASE_URL="http://localhost:8000" echo "=== 异步任务并发控制测试 ===" echo "" # 1. 检查服务是否运行 echo "1. 检查服务状态..." if ! curl -s "${BASE_URL}/healthz" > /dev/null; then echo "❌ 服务未运行,请先启动服务" exit 1 fi echo "✅ 服务正常运行" echo "" # 2. 查询初始并发状态 echo "2. 查询初始并发状态..." curl -s "${BASE_URL}/jobs/concurrency/status" | jq '.' echo "" # 3. 创建多个任务 echo "3. 创建 15 个任务(测试并发限制)..." JOB_IDS=() for i in {1..15}; do # 使用较大的质数,让任务执行时间更长 NUMBER=$((10000 + i * 1000)) RESPONSE=$(curl -s -X POST "${BASE_URL}/jobs" \ -H "Content-Type: application/json" \ -d "{\"algorithm\": \"PrimeChecker\", \"params\": {\"number\": ${NUMBER}}}") JOB_ID=$(echo "$RESPONSE" | jq -r '.job_id') JOB_IDS+=("$JOB_ID") echo " 创建任务 ${i}/15: job_id=${JOB_ID}" # 短暂延迟,避免请求过快 sleep 0.1 done echo "" # 4. 立即查询并发状态(应该看到多个任务在运行) echo "4. 查询并发状态(任务执行中)..." for i in {1..5}; do echo " 第 ${i} 次查询:" STATUS=$(curl -s "${BASE_URL}/jobs/concurrency/status") echo " $(echo "$STATUS" | jq -c '.')" sleep 1 done echo "" # 5. 等待所有任务完成 echo "5. 等待任务完成..." COMPLETED=0 TOTAL=${#JOB_IDS[@]} while [ $COMPLETED -lt $TOTAL ]; do COMPLETED=0 for JOB_ID in "${JOB_IDS[@]}"; do STATUS=$(curl -s "${BASE_URL}/jobs/${JOB_ID}" | jq -r '.status') if [ "$STATUS" = "completed" ] || [ "$STATUS" = "failed" ]; then ((COMPLETED++)) fi done echo " 进度: ${COMPLETED}/${TOTAL} 任务完成" # 显示当前并发状态 CONCURRENCY=$(curl -s "${BASE_URL}/jobs/concurrency/status") echo " 并发状态: $(echo "$CONCURRENCY" | jq -c '.')" if [ $COMPLETED -lt $TOTAL ]; then sleep 2 fi done echo "" # 6. 查询最终并发状态 echo "6. 查询最终并发状态..." curl -s "${BASE_URL}/jobs/concurrency/status" | jq '.' echo "" # 7. 显示任务结果统计 echo "7. 任务结果统计..." COMPLETED_COUNT=0 FAILED_COUNT=0 for JOB_ID in "${JOB_IDS[@]}"; do STATUS=$(curl -s "${BASE_URL}/jobs/${JOB_ID}" | jq -r '.status') if [ "$STATUS" = "completed" ]; then ((COMPLETED_COUNT++)) elif [ "$STATUS" = "failed" ]; then ((FAILED_COUNT++)) fi done echo " 总任务数: ${TOTAL}" echo " 成功: ${COMPLETED_COUNT}" echo " 失败: ${FAILED_COUNT}" echo "" echo "=== 测试完成 ==="