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

变量示例:

  • UDIDs:[4243949213201]
  • 平台版本:[8.0,7,0]
  • 应用端口:[49214320]
  • 当前问题

    我有2个UDID,因此它将有2个端口运行。但目前它只是不断地无限地创建新端口

    Python代码

    以下代码导致appium服务器继续在新端口上启动

    所以问题是,当我只调用python脚本时,代码是有效的,但是如果我通过robot框架调用它,它不会结束。所以我们发现robot框架可能不是线程安全的

    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.
    
    建议的方法?

  • 修改代码以执行并行执行,而不使用python中的线程
  • 我一直在阅读robot框架的过程,看看我是否能在robot框架中做同样的事情
  • Pabot(这是一个很好的工具,但我们更喜欢只使用python或robot框架)
  • 如果有人能提供一些见解或帮助,我们将不胜感激


    谢谢大家!

    您看过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。。