From 2a9d0baa6a46cc0256cf38e2e28c3e583c621715 Mon Sep 17 00:00:00 2001 From: Snowykami Date: Thu, 17 Apr 2025 21:21:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=99=90=E6=B5=81=E6=9C=BA?= =?UTF-8?q?=E5=88=B6=EF=BC=8C=E5=B0=86=E4=BF=A1=E5=8F=B7=E9=87=8F=E4=BB=8E?= =?UTF-8?q?=201=20=E6=9B=B4=E6=94=B9=E4=B8=BA=205=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BB=BB=E5=8A=A1=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BB=A5=E6=94=AF=E6=8C=81=E5=B9=B6=E5=8F=91=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sync.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/sync.py b/sync.py index b2f97d8..a5baf34 100644 --- a/sync.py +++ b/sync.py @@ -1,4 +1,6 @@ import asyncio +from types import CoroutineType +from typing import Any, Awaitable, Callable, Coroutine import aiofiles import yaml from pydantic import BaseModel @@ -39,11 +41,12 @@ async def docker_push(image: str) -> int | None: print(f"Pushing image {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: - return await task + return await task() + async def main(): async with aiofiles.open('images.yaml', 'r') as file: @@ -59,19 +62,20 @@ async def main(): for image in config.images: if len(image.tags) > 0: for tag in image.tags: - async def task(): - await docker_pull(f"{image.source}:{tag}") - await docker_tag(f"{image.source}:{tag}", f"{image.target}:{tag}") - await docker_push(f"{image.target}:{tag}") - tasks.append(limited_task(task())) + async def task() -> int | None: + return (await docker_pull(f"{image.source}:{tag}")) \ + or (await docker_pull(f"{image.source}:{tag}")) \ + or (await docker_push(f"{image.target}:{tag}")) + tasks.append(limited_task(task)) else: - async def task(): - await docker_pull(image.source) - await docker_tag(image.source, image.target) - await docker_push(image.target) - tasks.append(limited_task(task())) + async def task() -> int | None: + return (await docker_pull(image.source)) \ + or (await docker_pull(image.source)) \ + or (await docker_push(image.target)) + tasks.append(limited_task(task)) results = await asyncio.gather(*tasks) + print(tasks) failed_tasks = 0 for result in results: if result is not None and result != 0: