Подпроцесс Python всегда ждет программы [duplicate]

Вы хотите посмотреть Xdebug и, более конкретно, возможности профилирования Xdebug .

В принципе, вы включаете профилировщик и каждый раз, когда вы загружать веб-страницу, он создает файл cachegrind, который может быть прочитан с помощью WinCacheGrind или KCacheGrind .

Xdebug может быть немного сложнее настроить, так что соответствующий раздел моего php.ini для справки:

[XDebug]
zend_extension = h:\xampp\php\ext\php_xdebug-2.1.1-5.3-vc6.dll
xdebug.remote_enable=true
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_dir=h:\xampp\cachegrind
xdebug.profiler_output_name=callgrind.%t_%R.out

И вот скриншот файла .out в WinCacheGrind :

enter image description here [/g5]

Это должно предоставить подробные сведения о том, насколько эффективен ваш PHP-скрипт. Вы хотите настроить таргетинг на то, что занимает больше времени. Например, вы можете оптимизировать одну функцию за половину времени, но ваши усилия будут лучше обслуживать, оптимизируя функцию, которая называется десятками, если не сотни раз во время загрузки страницы.

Если вы Любопытно, что это просто старая версия CMS, которую я написал для моего собственного использования.

203
задан ideasman42 10 March 2016 в 10:55
поделиться

6 ответов

  • 1
    Замечание: вы должны указать полный путь к исполняемому файлу. Эта функция не будет использовать переменную PATH, а вариант, который ее использует, недоступен в Windows. – sorin 28 October 2009 в 18:14
  • 2
    прямо меняет питон для меня. – pablo 28 February 2011 в 14:58
  • 3
    os.P_DETACH был заменен на os.P_NOWAIT. – oneself 6 July 2012 в 20:28
  • 4
    Из документов: «Обратите внимание, что модуль подпроцесса предоставляет более мощные средства для нереста новых процессов и получения их результатов; использование этого модуля предпочтительнее использования этих функций " - вместо этого используйте нижеприведенный ответ. – jtriley 6 June 2013 в 23:18
  • 5
    Могут ли люди, предлагающие использовать subprocess, дать нам подсказку, как отсоединить процесс с помощью subprocess? – rakslice 11 February 2014 в 23:56

Вероятно, вы хотите получить ответ на «Как вызвать внешнюю команду в Python» .

Самый простой способ - использовать функцию os.system, например:

import os
os.system("some_command &")

В принципе, все, что вы передадите функции system, будет выполнено так же, как если бы вы передали его в оболочку в скрипте.

287
ответ дан Community 15 August 2018 в 22:36
поделиться
  • 1
    @Dan: Как я могу убить процесс, когда он работает в фоновом режиме? Я хочу запустить его некоторое время (это демон, с которым я общаюсь) и убить его, когда я закончил с ним. Документы не помогают ... – Juan 7 July 2014 в 06:36
  • 2
    нормально, так как вы вынуждаете процесс заново, когда вам нужен результат Popen () для записи в его stdin? – Michael 19 July 2014 в 21:23
  • 3
    @ J.F.Sebastian: Я интерпретировал его как «как я могу создать независимый процесс, который не останавливает выполнение текущей программы». Как бы вы предложили изменить его, чтобы сделать это более явным? – Dan 17 December 2014 в 05:51
  • 4
    @Dan: правильный ответ: используйте Popen(), чтобы избежать блокировки основного потока, и если вам нужен демон, посмотрите на python-daemon package , чтобы понять, как должен себя вести себя хорошо определенный демона. Ваш ответ в порядке, если вы удалите все, начиная с & quot; Но будьте осторожны & quot; за исключением ссылки на документы подпроцесса. – jfs 17 December 2014 в 15:06
  • 5
    @Dan proc = subprocess.Popen(["rm","-r","some.file"]), а затем убить: proc.terminate() – A T 9 June 2015 в 04:52
  • 6
    IMHO, скрипты python обычно записываются как кросс-платформенные, и если существует простое кросс-платформенное решение, лучше придерживаться его. Никогда не знаете, придется ли вам в будущем работать с другой платформой :) Или, если кто-то другой захочет перенести ваш скрипт на свою платформу. – d9k 1 May 2016 в 02:37
  • 7
    Эта команда является синхронной (т. Е. Всегда ожидает завершения начатого процесса). – tav 7 October 2017 в 09:10
  • 8
    @ d9k os.system не переносится? – lucid_dreamer 4 June 2018 в 17:55
  • 9
    @ d9k - это не выбор запуска чего-то в фоновом режиме, уже позиционирующего вас в posix-land? Что бы вы сделали в Windows? Запуск в качестве сервиса? – lucid_dreamer 4 June 2018 в 17:57

Вероятно, вы захотите начать изучение модуля os для разветвления различных потоков (путем открытия интерактивного сеанса и выдачи справки (os)). Соответствующими функциями являются fork и любой из exec. Чтобы дать вам представление о том, как начать, поместите что-то подобное в функцию, которая выполняет fork (функция должна принимать список или кортеж «args» в качестве аргумента, который содержит имя и параметры программы, также может потребоваться для определения stdin, out и err для нового потока):

try:
    pid = os.fork()
except OSError, e:
    ## some debug output
    sys.exit(1)
if pid == 0:
    ## eventually use os.putenv(..) to set environment variables
    ## os.execv strips of args[0] for the arguments
    os.execv(args[0], args)
11
ответ дан Gerald Senarclens de Grancy 15 August 2018 в 22:36
поделиться

Используйте subprocess.Popen() с параметром close_fds=True, который позволит отбросить подпроцесс от самого процесса Python и продолжить работу даже после выхода Python.

https: // gist.github.com/yinjimmy/d6ad0742d03d54518e9f

import os, time, sys, subprocess

if len(sys.argv) == 2:
    time.sleep(5)
    print 'track end'
    if sys.platform == 'darwin':
        subprocess.Popen(['say', 'hello'])
else:
    print 'main begin'
    subprocess.Popen(['python', os.path.realpath(__file__), '0'], close_fds=True)
    print 'main end'
14
ответ дан JHobern 15 August 2018 в 22:36
поделиться
  • 1
    В окнах он не отсоединяется, но использует параметр createflags – SmartManoj 26 April 2018 в 15:43

Я нашел здесь здесь :

В Windows (win xp) родительский процесс не завершится до тех пор, пока longtask.py не завершит свою работу. Это не то, что вы хотите в CGI-скрипте. Проблема не специфична для Python, в сообществе PHP проблемы одинаковы.

Решение состоит в том, чтобы передать DETACHED_PROCESS флаг создания процесса в базовую функцию CreateProcess в win API. Если вы установили pywin32, вы можете импортировать флаг из модуля win32process, иначе вы должны определить его самостоятельно:

DETACHED_PROCESS = 0x00000008

pid = subprocess.Popen([sys.executable, "longtask.py"],
                       creationflags=DETACHED_PROCESS).pid
21
ответ дан rstackhouse 15 August 2018 в 22:36
поделиться
287
ответ дан Community 5 September 2018 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: