使用Azure DevOps Python API多线程创建Wiki页面遇TF401028错误
解决Azure DevOps Wiki多线程创建页面的TF401028冲突错误
错误原因
Azure DevOps的Wiki本质是基于Git仓库存储的,每创建/更新一个页面都会生成一次Git提交。当你用多线程并发操作时,多个线程同时基于仓库的同一个旧版本进行修改提交,第一个线程提交成功后会更新仓库的HEAD版本,后续线程再提交时就会因为版本不匹配触发TF401028冲突错误。
解决方案
1. 增加错误重试机制
捕获特定的冲突错误,自动重试几次,每次重试前等待几秒,让仓库状态同步。
修改write_one_epic函数,加入重试逻辑:
import time from azure.devops.exceptions import AzureDevOpsServiceError def write_one_epic(task, requests_session): max_retries = 3 retry_delay = 2 # 每次重试间隔2秒 for attempt in range(max_retries): try: # 原有的wiki创建逻辑 wiki.create_or_update_page( content=task['content'], project=Constant.project, wiki_identifier=Constant.wikiIdentifier, path=self.actual_path, version=None ) break except AzureDevOpsServiceError as e: if "TF401028" in str(e): if attempt < max_retries - 1: time.sleep(retry_delay) continue else: # 重试次数耗尽,抛出错误或记录日志 raise else: # 其他错误直接抛出 raise
2. 控制并发线程数
不要一次性启动300个线程,限制并发数量(比如5-10个),减少冲突概率。用ThreadPoolExecutor时指定max_workers:
from concurrent.futures import ThreadPoolExecutor if multithreading: max_workers = 8 # 根据实际情况调整,建议5-10 with ThreadPoolExecutor(max_workers=max_workers) as executor: executor.map(write_one_epic, task_list, [requests_session]*len(task_list))
3. 备选方案:串行批量提交(适合冲突频繁场景)
如果重试和控制并发还是有大量冲突,可以改成串行创建,每批次后短暂等待,降低仓库版本冲突的概率:
for task in task_list: write_one_epic(task, requests_session) time.sleep(0.5) # 短暂等待,给仓库状态同步留时间
内容的提问来源于stack exchange,提问作者Kaiwinta
相关产品推荐
相关产品推荐

