====== Многопоточное программирование и вызов внешних программ ======
==== Запуска многопоточного выполнения функции через ThreadPoolExecutor ====
from time import sleep
from concurrent.futures import ThreadPoolExecutor
def work(i):
sleep(1)
return f'Task {i} is complete'
data = list(range(8))
results = []
with ThreadPoolExecutor(2) as executor:
for result in executor.map(work, data):
print(result)
results.append(result)
print(results)
===== Исполнение внешних программ =====
==== Запуск с ожиданием завершения ====
Простейший метод запуска программы метод ''os.system'':
import os
ret = os.system("dir")
# ret - код завершения программы
# 0 - успешно, иначе ошибка
Вызов блокирующий - программа ждет завершения команды вызванной через ''os.system''.
==== Запуск с получением вывода ====
import subprocess
output = subprocess.check_output('ping 127.0.0.1 -n 6', encoding="cp866")
print(output)
Вызов блокирующий - программа ждет завершения команды вызванной через ''subprocess.check_output''.
==== Запуск без ожидания завершения ====
Метод ''subprocess.Popen'' по умолчанию запускает процесс без ожидания завершения:
import subprocess
q = subprocess.Popen("ping 127.0.0.1 -n 6", shell=True)
while q.poll() is None:
print('waiting...')
sleep(1)
print("Finished with code", q.poll())
==== Что еще нужно знать о запуске внешних программ ====
* Если вы нажимаете Ctrl-C пока внешняя программа запущена через os.system, то этот сигнал уйдет ей, а не Python.
* Можно взаимодействовать с интерактивными консольными приложениями пока те запущены через ''Popen''. В частности их можно принудительно завершить или прочитать вывод до завершения самой программы.
* Большинство приложений с графическим интерфейсом в качестве первого и единственного аргумента принимают имя файла, который должен быть в них открыт.