Как предотвратить завершение процесса на KeyboardInterrupt? - PullRequest
2 голосов
/ 03 августа 2011

Я возился с проектом Django.Чего я хочу добиться, так это запустить проект Django в другом процессе, в то время как родительский процесс инициирует загрузку написанного мной произвольного кода (серверная часть моего проекта).Очевидно, что процесс Django и родительские процессы взаимодействуют.Я бы хотел, чтобы словарь читался и записывался процессами.

У меня есть следующий код, основанный на примерах из здесь :

#!/usr/bin/env python

from multiprocessing import Process, Manager
import os
import time
from dj import manage

def django(d, l):
    print "starting django"

    d[1] = '1'
    d['2'] = 2
    d[0.25] = None
    l.reverse()
    manage.start()

def stop(d, l):

    print "stopping"
    print d
    print l

if (__name__ == '__main__'):
    os.system('clear')
    print "starting backend..."
    time.sleep(1)
    print "backend start complete."

    manager = Manager()

    d = manager.dict()
    l = manager.list(range(10))

    p = Process(target=django, args=(d, l))
    p.start()

    try:
        p.join()
    except KeyboardInterrupt:
        print "interrupt detected"

    stop(d, l)

КогдаЯ нажимаю CTRL + C, чтобы убить процесс Django, я вижу, что сервер Django выключен, и вызывается stop().Тогда я хочу увидеть печатный словарь d и список l.

Вывод:

starting backend...
backend start complete.
starting django
Validating models...

0 errors found
Django version 1.3, using settings 'dj.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
^Cinterrupt detected
stopping
<DictProxy object, typeid 'dict' at 0x141ae10; '__str__()' failed>
<ListProxy object, typeid 'list' at 0x1425090; '__str__()' failed>

Не удается найти словарь илисписок после события CTRL + C.Был ли завершен процесс Manager при выдаче SIGINT?Если это так, можно ли как-то помешать этому завершиться и завершиться основным процессом?

Надеюсь, это имеет смысл.Любая помощь очень получила.

1 Ответ

0 голосов
/ 03 августа 2011

Хорошо, пока я не вижу возможности просто игнорировать исключение.Когда вы поднимаетесь, вы всегда идете прямо в блок «кроме», если он есть.Здесь я предлагаю кое-что, что перезапустит ваше приложение django на каждом ^ C, но учтите, что для выхода нужно добавить некоторую заднюю дверь.

Теоретически вы можете заключить каждую строку в try..except.. block, и это будет действовать как перезапуск каждой строки, что не будет таким же видимым, как перезапуск всего скрипта.Если кто-нибудь найдет действительно работающее решение, я буду первым, кто его оповестит.

Вы можете установить все внутри вашей if (__name__ == '__main__'): в функцию o main и оставить что-то вроде этого:

def main():
    #all the code...

if (__name__ == '__main__'):
    while True:
        try:
            main()
        except KeyboardInterrupt:
            pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...