开发者

How to prevent a process from terminating on a KeyboardInterrupt?

I've been messing around with a Django project. What I want to achieve is the Django project starting up in another process while the parent process initiates a load of arbitary code I have written (the backend of my project). Obviously, the Django process and parent processes communicate. I'd like a dictionary to be read and written to by the processes.

I have the following code, based upon examples from here:

#!/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)

When I hit CTRL+C to kill the Django process, I'm seeing the Django server shut down, and stop() being called. Then what I want to see is the dictionary, d, and list, l, being printed.

Output is:

starting bac开发者_如何学编程kend...
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>

It can't find the dictionary or list after the CTRL+C event. Has the Manager process been terminated when the SIGINT is issued? If it is, is there anyway to stop it from terminating there and terminating with the main process?

I hope this makes sense. Any help greatly receieved.


Ok, as far I see no possibility to simply ignore exception. When you rise one, you always go straight into a "except" block if there is one. What I'm proposing here is something what will restart your django application on each ^C, but note, that there should be added some back door for leaving.

In theory, you can wrap each line with a try..except.. block and that would act like a restart of each line, what will not be as visible as restart of whole script. If anyone finds a really-working solution, I will be the first one to upvote him.

You can set all inside your if (__name__ == '__main__'): into o main function and leave something like this:

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

if (__name__ == '__main__'):
    while True:
        try:
            main()
        except KeyboardInterrupt:
            pass
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜