Пример с асинхронным запуском всех проектов и их опросом статусов в цикле
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())