blob: 50e69ad1d2a192aba55d56e656f572a75a13525a [file] [log] [blame]
#!/usr/bin/env python3
r"""
This module contains keyword functions to support multiprocessing
execution of keywords where generic robot keywords don't support.
"""
import datetime
import os
from multiprocessing import Manager, Process
from robot.libraries.BuiltIn import BuiltIn
def execute_keyword(keyword_name, return_dict):
r"""
Execute a robot keyword.
In addition to running the caller's keyword, this function will:
- Add an entry to the return_dict
Description of argument(s):
keyword_name Keyword name to be executed.
return_dict A dictionary consisting of pid/process status for the
keys/values. This function will append a new entry to
this dictionary.
"""
pid = os.getpid()
status = BuiltIn().run_keyword_and_return_status(keyword_name)
# Build PID:<status> dictionary.
return_dict[str(pid)] = str(status)
def execute_process(num_process, keyword_name):
r"""
Execute a robot keyword via multiprocessing process.
Description of argument(s):
num_process Number of times keyword to be executed.
keyword_name Keyword name to be executed.
"""
manager = Manager()
return_dict = manager.dict()
process_list = []
# Append user-defined times process needed to execute.
for _ix in range(int(num_process)):
task = Process(
target=execute_keyword, args=(keyword_name, return_dict)
)
process_list.append(task)
task.start()
# Wait for process to complete.
for task in process_list:
task.join()
# Return function return codes.
return return_dict
def execute_keyword_args(keyword_name, args, return_dict):
r"""
Execute a robot keyword with arguments.
In addition to running the caller's keyword, this function will:
- Add an entry to the return_dict
Description of argument(s):
keyword_name Keyword name to be executed.
args Arguments to keyword.
return_dict A dictionary consisting of pid/process status for the
keys/values. This function will append a new entry to
this dictionary.
"""
execution_time = datetime.datetime.now()
status = BuiltIn().run_keyword_and_return_status(keyword_name, *args)
# Build execution time:<status> dictionary.
return_dict[str(execution_time)] = str(status)
def execute_process_multi_keyword(number_args, *keyword_names):
r"""
Execute multiple robot keywords with arguments via multiprocessing process.
Description of argument(s):
number_args Number of argument in keywords.
keyword_names Keyword name to be executed.
"""
manager = Manager()
return_dict = manager.dict()
process_list = []
# Append each keyword with its arguments in a process to execute.
for keywords_data in keyword_names:
keyword_args = tuple(keywords_data.split(" ")[-number_args:])
keyword_name = " ".join(keywords_data.split(" ")[:-number_args])
task = Process(
target=execute_keyword_args,
args=(keyword_name, keyword_args, return_dict),
)
process_list.append(task)
task.start()
# Wait for process to complete.
for task in process_list:
task.join()
return return_dict.copy()
def get_current_date_time():
r"""
Gets current time.
"""
current_time = datetime.datetime.now().strftime("%H:%M:%S.%f")
return current_time