如何防止进程因键盘中断而终止?

发布于 2024-11-27 13:44:34 字数 1657 浏览 1 评论 0原文

我一直在搞一个 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 事件后找不到字典或列表。当发出 SIGINT 时 Manager 进程是否已终止?如果是,是否有办法阻止它终止并终止主进程?

我希望这是有道理的。 非常收到任何帮助。

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 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>

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

离去的眼神 2024-12-04 13:44:34

好吧,到目前为止我认为不可能简单地忽略异常。当你上升一个时,如果有一个,你总是直接进入“例外”块。我在这里建议的是在每个 ^C 上重新启动 django 应用程序,但请注意,应该添加一些用于离开的后门。

理论上,您可以用 try.. except.. 块包装每一行,这就像重新启动每一行,而不会像重新启动整个脚本那样可见。如果有人找到真正有效的解决方案,我将是第一个投票给他的人。

您可以将 if (__name__ == '__main__'): 中的所有内容设置为 o main 函数,并保留如下内容:

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

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

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文