我有一个脚本,1.下载并推送二进制文件到内部注册表(func_to_push_image)和2.处理消息队列的一部分消息,通过过滤关键字的消息来查看推送是否成功3.如果推送成功,监视并处理消息队列的另一部分,通过查看install_status关键字来验证这两个二进制文件是否安装。
推送操作的超时时间为2分钟,否则脚本立即失败。安装操作的超时时间为1分钟,否则脚本超时失败。
二进制文件安装的消息队列输出如下所示。
{
"location": "root",
"md5":"a3288ec45c8d159fbb656972eb4cdfg84jsfbsdf",
"fireEye":"v3",
"Binaries":[
A:{
"name":"HP-Protect",
"version": "v1.3",
"effect": "NIL",
"install_status":"On Going",
}
B:{
"name":"Covertur",
"version": "v1.0",
"effect": "NIL",
"install_status":"Installed"
}]
}
编辑代码:
registry_timeout = 2
install_timeout = 1
Other variables holding server and partition details.
def get_info_from_messaging_queue(server, broker):
depending on the partition, returns the messages from the messaging queue.
def func_to_push_image():
logic to upload the artifact to the registry.
def func_to_check_status_of_installed_binaries(): #This function should Ideally check the status of both binaries has been "Completed"
status = False
install_status = get_info_from_messaging_queue(server, broker)
if install_status['Binaries'][A]['install_status'] == "Completed" and install_status['Binaries'][B]['install_status'] == "Completed":
status = True
return status
# to check if image is pushed within 2 minutes.
def timeout_verify_push_status():
start = datetime.now()
stop = start + timedelta(minutes=registry_timeout)
while True:
push_status = func_to_push_image()
if push_status:
break
start = datetime.now()
if start > stop_time:
print("Timed Out while pushing image to registry...")
break
# to check if installation is complete within a minute..
def timeout_verify_installation_status()():
start = datetime.now()
stop = start + timedelta(minutes=install_timeout)
while True:
install_status = func_to_check_status_of_installed_binaries()
if install_status:
break
start_time = datetime.now()
if start_time > stop_time:
print("Timeout while installtion of Binaries...")
break
if __name__ == '__main__':
timeout_verify_push_status()
timeout_verify_installation_status()
这可以完成任务,如果状态不是在一分钟内完成,它就会超时,但是效率不高,我试图使用一个函数来处理超时条件,但是失败了。
1条答案
按热度按时间sirbozc51#
你可以使用threadPoolExecutor或processPoolExecutor: