2017-02-15 5 views
0

Я пытаюсь одновременно установить Android APK на нескольких устройствах Android одновременно.Выполнение трех функций одновременно в Python не работает

Моя идея заключается в том, чтобы вызвать команду оболочки, которая устанавливает APK как:

adb -s DEVICE_NAME install APK & 

следуют с &, как он начинает новый терминальный процесс.

Мой скрипт Python должен выполнять функцию install(device_name) в то же время. Но этого не происходит. Существует код:

from ShellHelper import * 
from threading import Thread 
import time 
import datetime 


shellHelper = ShellHelper() 

apk_dir = "app-automation-integrationTest.apk" 

def install(device_name): 
    start_time = int(round(time.time() * 1000)) 
    print('[{:%H:%M:%S}]: '.format(datetime.datetime.now()) 
      + "Installation started on device '" + device_name + "'.") 

    install_cmd = "adb -s " + device_name + " install " + apk_dir + " &" 
    shellHelper.execute_shell(install_cmd) 

    end_time = int(round(time.time() * 1000)) 
    print('[{:%H:%M:%S}]: '.format(datetime.datetime.now()) 
      + "Installation ended on device '" + device_name + "'. It took: " + str(
     (end_time - start_time)/1000) + " seconds.") 


if __name__ == '__main__': 
    Thread(target=install("emulator-5554")).start() 
    Thread(target=install("emulator-5556")).start() 
    Thread(target=install("emulator-5558")).start() 

Срубы:

[23:31:50]: Installation started on device 'emulator-5554'. 
[23:32:33]: Installation ended on device 'emulator-5554'. It took: 42.671 seconds. 
[23:32:33]: Installation started on device 'emulator-5556'. 
[23:32:37]: Installation ended on device 'emulator-5556'. It took: 4.451 seconds. 
[23:32:37]: Installation started on device 'emulator-5558'. 
[23:32:46]: Installation ended on device 'emulator-5558'. It took: 8.98 seconds. 

отбросив факт, если АБР способен устанавливать APK-в то же время ... то, что я ожидал бы случиться что-то похожее на это :

[23:31:50]: Installation started on device 'emulator-5554'. 
[23:31:50]: Installation started on device 'emulator-5556'. 
[23:31:50]: Installation started on device 'emulator-5558'. 
[23:32:10]: Installation ended on device 'emulator-5554'. It took: 20.00 seconds. 
[23:32:30]: Installation ended on device 'emulator-5558'. It took: 40.00 seconds. 
[23:32:33]: Installation ended on device 'emulator-5556'. It took: 43.00 seconds. 

Что я делаю неправильно?

// это работало

Thread(target=partial(install, "emulator-5554")).start() 
Thread(target=partial(install, "emulator-5556")).start() 
Thread(target=partial(install, "emulator-5558")).start() 

И ожидаемый результат:

[01:07:44]: Installation started on device 'emulator-5554'. 
[01:07:44]: Installation started on device 'emulator-5556'. 
[01:07:44]: Installation started on device 'emulator-5558'. 
[01:08:00]: Installation ended on device 'emulator-5558'. It took: 15.303 seconds. 
[01:08:00]: Installation ended on device 'emulator-5556'. It took: 15.571 seconds. 
[01:08:01]: Installation ended on device 'emulator-5554'. It took: 16.748 seconds. 
+0

Почему 'установить 'не вызываемый? Это функция. –

+0

Вам нужно было передать объект, а не вызов. Вы указываете аргументы функции с атрибутом конструктора 'args' с потоком. Частично не требуется –

+0

Благодарим вас за объяснение. Как я могу запустить его без частичного? Не могли бы вы привести мне пример? :) – F1sher

ответ

0

Вы можете запустить его без частичной помощью args параметров в конструкторе Thread:

Thread(target=install, args=('emulator-5558',)).start()