mineru_url_selector.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. # Copyright (c) Opendatalab. All rights reserved.
  2. """
  3. MinerU API 多实例 URL 轮询
  4. 当 API_URL 配置为逗号分隔的多个地址时(多卡多实例),按请求轮询使用。
  5. """
  6. import threading
  7. from typing import List
  8. from ..config import DEFAULT_API_URL
  9. _DEFAULT_SINGLE = DEFAULT_API_URL
  10. _URL_LIST: List[str] = []
  11. _URL_INDEX: int = 0
  12. _URL_LOCK = threading.Lock()
  13. def _parse_api_url_list() -> List[str]:
  14. """从配置解析 URL 列表(逗号分隔,去空格)。"""
  15. raw = DEFAULT_API_URL.strip()
  16. if not raw:
  17. return [_DEFAULT_SINGLE]
  18. return [u.strip() for u in raw.split(",") if u.strip()] or [_DEFAULT_SINGLE]
  19. def _get_url_list() -> List[str]:
  20. """解析并缓存 API_URL 列表(逗号分隔)。"""
  21. global _URL_LIST
  22. with _URL_LOCK:
  23. if not _URL_LIST:
  24. _URL_LIST[:] = _parse_api_url_list()
  25. return list(_URL_LIST)
  26. def get_mineru_api_url_list() -> List[str]:
  27. """
  28. 返回 MinerU API 地址列表(用于单任务多卡:按页拆分后并行发到各实例)。
  29. 当 API_URL 为逗号分隔多地址时返回多元素;单地址时返回单元素列表。
  30. """
  31. return _get_url_list()
  32. def get_next_mineru_api_url() -> str:
  33. """
  34. 获取下一次应使用的 MinerU API 地址(线程安全轮询)。
  35. 当 API_URL 为多个地址(逗号分隔)时轮流返回;单地址则始终返回该地址。
  36. """
  37. global _URL_INDEX
  38. urls = _get_url_list()
  39. with _URL_LOCK:
  40. if len(urls) == 1:
  41. return urls[0]
  42. idx = _URL_INDEX % len(urls)
  43. _URL_INDEX += 1
  44. return urls[idx]