Как запустить новый процесс, когда concurrent.futures.ProcessPoolExecutor () уже запущен? - PullRequest
0 голосов
/ 02 мая 2020

Я запускаю тест на смартфоне, используя Python 3.7 и Appium 1.19 на Windows 10 с реальными Android смартфонами.

Мой скрипт использует concurrent.futures.ProcessPoolExecutor () для запуска всех смартфоны одновременно. Вот как работает мой скрипт:

  1. инициировать блокировку для многопроцессорной обработки
  2. подключиться к локальной базе данных, чтобы получить и сохранить некоторые сведения о подключенных смартфонах
  3. запустить сервер приложений ( убить существующий сервер appium, чтобы избежать исключений) получить UID и другие сведения о подключенных смартфонах
  4. подготовить номер порта для запуска смартфона на сервере Appium
  5. запустить многопроцессорную работу, чтобы запустить все смартфоны в Параллельно в то же время

Я хотел бы разработать систему «plug n play», в которой скрипт постоянно работает, и когда я подключаю новый смартфон по USB, скрипт обнаруживает его и начать новый процесс , чтобы запустить функцию "run_smartphone", которая должна быть выполнена автоматически.

Вот код:

import concurrent.futures
import multiprocessing
multiprocessing.freeze_support()
import sqlite3
import subprocess
import time
import psutil
import mymodules

if __name__ == '__main__':
    # initiate a lock for multiprocessing
    m = multiprocessing.Manager()
    lock = m.Lock()

    # connect to local database
    sqliteConnection = sqlite3.connect('db.db')
    cursor = sqliteConnection.cursor()

    # start appium server (kill the existing appium server to avoid exception)
    while True:
        try:
            PROCNAME = "node.exe"
            for proc in psutil.process_iter():

                if proc.name() == PROCNAME:
                    print(f"PhoneBot will kill this process : {proc}")
                    proc.kill()

            # os.system("start /B start cmd.exe @cmd /k appium --log appium.log --log-level error:debug --debug-log-spacing --async-trace --relaxed-security")
            proc = subprocess.Popen('appium --log appium.log --log-level error:debug --debug-log-spacing --async-trace',
                                    shell=True,
                                    stdin=None, stdout=None, stderr=None, close_fds=True)

            print("Appium server starting....")
            time.sleep(15)
            break
        except Exception as ex:
            print(
                f"{ex} --> We couldn't start Appium server.... Be sure to have installed it and add the path to variable environment!")

    # Start the Appium activities for each smartphone connected
    while True:

        # get the UID and other details of connected smartphones

        quantity_connected_phones = mymodules.get_details_smartphones()
        list_smartphones_connected_tuple = cursor.execute(
                    'SELECT udid, systemPort, deviceName, platformversion, OS_device FROM smartphones where status=1').fetchall()
        list_smartphones_connected = [item[0] for item in list_smartphones_connected_tuple]
        print(f"list_smartphones_connected : {list_smartphones_connected}")
        print("MULTIPROCESSING :" + str(list_smartphones_connected))
        # === Let's try to madd some lock



        # let's prepare the port number to run the smartphone on Appium server
        mymodules.give_systemPort_to_smartphones()


        # start the multiprocessing to run all the smartphones in parallel at the same time
        with concurrent.futures.ProcessPoolExecutor() as executor:
            try:

                multiprocesses = executor.map(mymodules.run_smartphone, list_smartphones_connected,
                                              [lock] * len(list_smartphones_connected))
                for function_return_value in multiprocesses:
                    print(function_return_value)

            except Exception as ex:
                print(f"{ex} --> Error multiprocesses")

Я запускаю этот скрипт и подождите, пока работает 1 смартфон ... Затем я подключил второй смартфон, который был обнаружен windows ... но ничего не произошло. Я полагаю, это потому, что многопроцессорность еще не завершена, и он должен закончиться, чтобы вернуться к l oop и обнаружить новый подключенный смартфон.

Как определить каждый новый подключенный смартфон и запустить новый процесс для каждого из них?

...