У меня есть модуль, который я использую для таких ситуаций - куда процесс будет работать в течение долгого времени, но иногда застревает по неизвестным и невоспроизводимым причинам. Это - немного hacky, и только работает над Unix (требует сигналов):
import code, traceback, signal
def debug(sig, frame):
"""Interrupt running process, and provide a python prompt for
interactive debugging."""
d={'_frame':frame} # Allow access to frame object.
d.update(frame.f_globals) # Unless shadowed by global
d.update(frame.f_locals)
i = code.InteractiveConsole(d)
message = "Signal received : entering python shell.\nTraceback:\n"
message += ''.join(traceback.format_stack(frame))
i.interact(message)
def listen():
signal.signal(signal.SIGUSR1, debug) # Register handler
Для использования просто назовите слушать () функция в какой-то момент, когда программа запускает (Вы могли даже придерживаться, это в site.py для имения всех программ Python использует его), и позвольте ему работать. В любой точке отправьте процессу сигнал SIGUSR1, использование уничтожает, или в Python:
os.kill(pid, signal.SIGUSR1)
Это заставит программу повреждаться к консоли Python в точке, в которой это в настоящее время, показывая Вам отслеживание стека и разрешение Вам управлять переменными. Используйте управление-d (EOF), чтобы продолжить работать (хотя примечание, что Вы, вероятно, прервете любой ввод-вывод и т.д. в точке, о которой Вы предупреждаете, таким образом, это не полностью ненавязчиво.
у меня есть другой сценарий, который делает то же самое, кроме него связывается с рабочим процессом через канал (для обеспечения отладки фоновых процессов и т.д.). Это является немного большим для регистрации здесь, но я добавил его как рецепт .
поваренной книги Python
Проблема, которую вы сталкиваются с тем, что отправляемый вами ответ все еще неполный. Несмотря на то, что вы сбрасываете все, что находится в буферах, в браузер, браузер по-прежнему должен ждать окончания ответа или обрабатывать то, что он получил, - отсюда разница между браузерами.
Что еще хуже, вы можете ожидать такого же поведения от некоторых концентраторов промежуточных узлов, межсетевых экранов и т. Д., Расположенных в Интернете между вашим сервером и браузером.
Суть в том, что если вы хотите, чтобы этот браузер что-то делает с вашим потоком данных, вы должны завершить это с помощью Response.End.
When you call Response.Flush() before the response is complete (before Content-Length is known), the ASP.NET runtime generates a chunked-encoding partial response. It's up to the browser to decide how to render that. In my testing I've found that browsers do tend to render images ( tags) that are included in a partial response. You might give that a try.
However, be careful about sending