From 30a1b7de6a1ec24cb5996dbe986bb242236b3c43 Mon Sep 17 00:00:00 2001 From: Snowykami Date: Thu, 17 Apr 2025 21:00:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=BB=E5=8A=A1=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=80=BB=E8=BE=91=EF=BC=8C=E6=B7=BB=E5=8A=A0=E9=99=90?= =?UTF-8?q?=E6=B5=81=E6=9C=BA=E5=88=B6=E4=BB=A5=E6=8E=A7=E5=88=B6=E5=B9=B6?= =?UTF-8?q?=E5=8F=91=E4=BB=BB=E5=8A=A1=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sync.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/sync.py b/sync.py index 596cf63..838a6d7 100644 --- a/sync.py +++ b/sync.py @@ -1,7 +1,7 @@ import asyncio import aiofiles import yaml -from pydantic import BaseModel, field_validator +from pydantic import BaseModel class Config(BaseModel): images: list["Images"] = [] @@ -39,6 +39,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(5) + +async def limited_task(task): + async with semaphore: + return await task + async def main(): async with aiofiles.open('images.yaml', 'r') as file: config = await file.read() @@ -57,20 +63,21 @@ async def main(): 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(task()) + 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(task()) + tasks.append(limited_task(task())) results = await asyncio.gather(*tasks) failed_tasks = 0 for result in results: if result is not None and result != 0: failed_tasks += 1 - print(f"{len(results)} tasks completed. {len(result) - failed_tasks} succeed, {failed_tasks} failed.") + + print(f"{len(results)} tasks completed. {len(results) - failed_tasks} succeed, {failed_tasks} failed.") if __name__ == "__main__": asyncio.run(main()) \ No newline at end of file