Вы хотите посмотреть 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 :
[/g5]
Это должно предоставить подробные сведения о том, насколько эффективен ваш PHP-скрипт. Вы хотите настроить таргетинг на то, что занимает больше времени. Например, вы можете оптимизировать одну функцию за половину времени, но ваши усилия будут лучше обслуживать, оптимизируя функцию, которая называется десятками, если не сотни раз во время загрузки страницы.
Если вы Любопытно, что это просто старая версия CMS, которую я написал для моего собственного использования.
Примечание. Этот ответ менее точен, чем когда он был отправлен в 2009 году. Теперь [f0] ] (Обратите внимание, что модуль подпроцесса обеспечивает более мощные возможности для создания новых процессов и получения их результатов, использование этого модуля предпочтительнее использования этих функций.) Если вы хотите, чтобы ваш процесс для начала в фоновом режиме вы можете использовать (или, альтернативно, вы можете попробовать менее портативный флаг См. документацию
system()
и называть его так же, как это сделал ваш сценарий оболочки, или вы можете spawn
его: import os
os.spawnl(os.P_DETACH, 'some_long_running_command')
os.P_NOWAIT
).
Вероятно, вы хотите получить ответ на «Как вызвать внешнюю команду в Python» .
Самый простой способ - использовать функцию os.system
, например:
import os
os.system("some_command &")
В принципе, все, что вы передадите функции system
, будет выполнено так же, как если бы вы передали его в оболочку в скрипте.
Popen()
, чтобы избежать блокировки основного потока, и если вам нужен демон, посмотрите на python-daemon
package , чтобы понять, как должен себя вести себя хорошо определенный демона. Ваш ответ в порядке, если вы удалите все, начиная с & quot; Но будьте осторожны & quot; за исключением ссылки на документы подпроцесса.
– jfs
17 December 2014 в 15:06
proc = subprocess.Popen(["rm","-r","some.file"])
, а затем убить: proc.terminate()
– A T
9 June 2015 в 04:52
Вероятно, вы захотите начать изучение модуля 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)
os.fork()
действительно полезен, но у него есть заметный недостаток, доступный только на * nix.
– Evan Fosmark
28 July 2009 в 20:15
Используйте 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'
Я нашел здесь здесь :
В 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
subprocess
, дать нам подсказку, как отсоединить процесс с помощьюsubprocess
? – rakslice 11 February 2014 в 23:56