Пример с асинхронным запуском всех проектов и их опросом статусов в цикле

import tracemalloc import asyncio from datetime import datetime, timedelta import time import requests from requests.auth import HTTPBasicAuth """ Кейс: хотим запустить "Запуск всех проектов в Экстракторе 1С" База: Srvr="srv2:1841";Ref="zm508635_ut"; """ name_Connector = "Рабочая ДЕНВИК ERP 2.5" timeout = 10 #10 minutes auth = HTTPBasicAuth( username='admin', password='admin_pass' ) host = 'http://130.193.54.221:8080' projects = {} async def exec_all_projects(): res = requests.get( f'{host}/api/v1/get_connectors', params={ 'connector_name': name_Connector }, auth=auth ) res.raise_for_status() data = res.json()['data'] id_connector = data[0].get('id_connector') res = requests.get( f'{host}/api/v1/get_projects', params={ 'id_connector': id_connector, }, auth=auth ) res.raise_for_status() data = res.json()['data'] tasks = [] for next_Project in data: id_project = next_Project['id_project'] name_project = next_Project['name'] projects[id_project] = name_project is_deleted = next_Project['is_deleted'] if not is_deleted: id_task = create_task(id_connector, id_project) task = asyncio.create_task(wait_task_sensor(id_connector, id_task)) tasks.append(task) print(f'append task {id_task} for: {name_project} (id_project = {id_project})') for task in tasks: await task print('Finish all tasks') def create_task(id_connector, id_project): res = requests.post( f'{host}/api/v1/create_task', json={ "id_connector": id_connector, "id_project": id_project, "command_type": "exec" }, auth=auth ) res.raise_for_status() data = res.json() id_task = data['id_task'] return id_task async def wait_task_sensor(id_connector, id_task): timeout_dt = datetime.now() + timedelta(minutes=timeout) while datetime.now() < timeout_dt: res = requests.post( f'{host}/api/v1/get_task_status', params={ 'id_connector': id_connector }, json=[id_task, ], auth=auth ) res.raise_for_status() data = res.json() task_status = data[0]['status'] id_project = data[0]['id_project'] name_project = projects[id_project] if task_status == 'success': print(f'Task {id_task} completed {task_status} for: {name_project} (id_project = {id_project})') return if task_status == 'error': print(f'DCC Task error! id_task: {id_task} for: {name_project} (id_project = {id_project})') # raise Exception(f'ECC Task error! id_task: {id_task} id_connector: {id_connector}') return await asyncio.sleep(5) #print(f'Task {id_task} waiting') print(f'Waiting DCC timeout error! For Task {id_task}') if __name__ == '__main__': asyncio.run(exec_all_projects())