修正限流机制,将信号量从 1 更改为 5,优化任务处理逻辑以支持并发执行
All checks were successful
Sync Container Images / sync-images (push) Successful in 1m9s

This commit is contained in:
2025-04-17 21:21:59 +08:00
parent bd273e0ec1
commit 2a9d0baa6a

30
sync.py
View File

@ -1,4 +1,6 @@
import asyncio import asyncio
from types import CoroutineType
from typing import Any, Awaitable, Callable, Coroutine
import aiofiles import aiofiles
import yaml import yaml
from pydantic import BaseModel from pydantic import BaseModel
@ -39,11 +41,12 @@ async def docker_push(image: str) -> int | None:
print(f"Pushing image {image}...") print(f"Pushing image {image}...")
return await run_command(f"docker push {image}") return await run_command(f"docker push {image}")
semaphore = asyncio.Semaphore(1) semaphore = asyncio.Semaphore(5)
async def limited_task(task): async def limited_task[T: Any](task: Callable[[], Coroutine[None, None, T]]) -> T:
async with semaphore: async with semaphore:
return await task return await task()
async def main(): async def main():
async with aiofiles.open('images.yaml', 'r') as file: async with aiofiles.open('images.yaml', 'r') as file:
@ -59,19 +62,20 @@ async def main():
for image in config.images: for image in config.images:
if len(image.tags) > 0: if len(image.tags) > 0:
for tag in image.tags: for tag in image.tags:
async def task(): async def task() -> int | None:
await docker_pull(f"{image.source}:{tag}") return (await docker_pull(f"{image.source}:{tag}")) \
await docker_tag(f"{image.source}:{tag}", f"{image.target}:{tag}") or (await docker_pull(f"{image.source}:{tag}")) \
await docker_push(f"{image.target}:{tag}") or (await docker_push(f"{image.target}:{tag}"))
tasks.append(limited_task(task())) tasks.append(limited_task(task))
else: else:
async def task(): async def task() -> int | None:
await docker_pull(image.source) return (await docker_pull(image.source)) \
await docker_tag(image.source, image.target) or (await docker_pull(image.source)) \
await docker_push(image.target) or (await docker_push(image.target))
tasks.append(limited_task(task())) tasks.append(limited_task(task))
results = await asyncio.gather(*tasks) results = await asyncio.gather(*tasks)
print(tasks)
failed_tasks = 0 failed_tasks = 0
for result in results: for result in results:
if result is not None and result != 0: if result is not None and result != 0: