修正限流机制,将信号量从 1 更改为 5,优化任务处理逻辑以支持并发执行
All checks were successful
Sync Container Images / sync-images (push) Successful in 1m9s
All checks were successful
Sync Container Images / sync-images (push) Successful in 1m9s
This commit is contained in:
30
sync.py
30
sync.py
@ -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:
|
||||||
|
Reference in New Issue
Block a user