Python 机器人框架中的并行执行(线程)
变量示例:Python 机器人框架中的并行执行(线程),python,robotframework,python-multithreading,Python,Robotframework,Python Multithreading,变量示例: UDIDs:[4243949213201] 平台版本:[8.0,7,0] 应用端口:[49214320] 当前问题 我有2个UDID,因此它将有2个端口运行。但目前它只是不断地无限地创建新端口 Python代码 以下代码导致appium服务器继续在新端口上启动 所以问题是,当我只调用python脚本时,代码是有效的,但是如果我通过robot框架调用它,它不会结束。所以我们发现robot框架可能不是线程安全的 def run_tests_on_devices(udid): th
def run_tests_on_devices(udid):
threads=[]
for idx, device in enumerate(udid):
cmd = "robot --variable PLATFORM_VERSION:" + str(get_platform_version_of_android_phone(device)) + " --variable DEVICE_UDID:" + str(device) + " --variable APPIUM_PORT:" + str(appiumInstances[idx]) + " android.robot"
t = threading.Thread(target=run_command, args = (cmd,))
t.daemon = True
threads.append(t)
for x in threads:
x.start()
sleep(3)
#Code is printing/working until here
for x in threads:
x.join()
#Does not reach until this stage. x.join() does not seem to be executed so the server kept on starting a new port.
建议的方法?
谢谢大家! 您看过pabot吗?为什么要将线程创建为守护进程?当主线程完成时,这样的操作会在中途突然停止,您可以通过调用
join()
来挽救它。但是这样做,实际上是在扼杀线程并行性,join()
正在阻止被调用线程内的执行,所有其他线程都在等待它的完成。另一件事引起了我对设计的注意——你没有做任何事来保留不同线程的日志。每个人都将在cwd中输出它们(output.xml、log和report htmls)。在被妖魔化的线程的串行执行中,这将是“OK”-每个连续的线程将重写它们,在这样做的过程中,您将得到最后一次执行的日志(仅)。但在实际的并行性中,两个线程将同时写入相同的output.xml,在最好的情况下会导致文件被篡改,在最坏的情况下会导致文件损坏;无论如何,结果都是您不会有执行日志。顺便说一句,pabot
不是您用例的解决方案:)它设计为并行运行一组套件-a+B+C,以运行ABC。而在您的情况下,您希望(并行)运行相同的套件,使用不同的参数-A+A+A,获得AAA。所以它不是直接适用的;不过,您可以重用它的一些实现,它与子进程vs线程一起使用(在大多数情况下,对于具有更多RAM的多进程机器,这是更好的)。或者,复制套件文件并按原样使用:)实际上,您可以使用不同的文件运行同一套件-参数文件1-argumentfileN argsN.dat..您看过pabot吗?为什么要将线程创建为守护进程?当主线程完成时,这样的操作会在中途突然停止,您可以通过调用join()
来挽救它。但是这样做,实际上是在扼杀线程并行性,join()
正在阻止被调用线程内的执行,所有其他线程都在等待它的完成。另一件事引起了我对设计的注意——你没有做任何事来保留不同线程的日志。每个人都将在cwd中输出它们(output.xml、log和report htmls)。在被妖魔化的线程的串行执行中,这将是“OK”-每个连续的线程将重写它们,在这样做的过程中,您将得到最后一次执行的日志(仅)。但在实际的并行性中,两个线程将同时写入相同的output.xml,在最好的情况下会导致文件被篡改,在最坏的情况下会导致文件损坏;无论如何,结果都是您不会有执行日志。顺便说一句,pabot
不是您用例的解决方案:)它设计为并行运行一组套件-a+B+C,以运行ABC。而在您的情况下,您希望(并行)运行相同的套件,使用不同的参数-A+A+A,获得AAA。所以它不是直接适用的;不过,您可以重用它的一些实现,它与子进程vs线程一起使用(在大多数情况下,对于具有更多RAM的多进程机器,这是更好的)。或者,复制套件文件并按原样使用:)实际上,您可以使用不同的文件运行同一套件-参数文件1-argumentfileN argsN.dat。。