簡體   English   中英

如何防止進程在KeyboardInterrupt上終止?

[英]How to prevent a process from terminating on a KeyboardInterrupt?

我一直在搞一個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 stop() 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進程是否已終止? 如果是,是否有其他方法可以阻止它終止於此並終止於主要過程?

我希望這是有道理的。 任何幫助都可以收到。

好的,到目前為止,我認為不可能簡單地忽略異常。 當您上升一個時,如果有一個,您總是直接進入“ except”塊。 我在這里建議的是在每個^ C上重新啟動django應用程序的方法,但是請注意,應該添加一些后門以供離開。

從理論上講,您可以使用try..except..塊包裝每行,這就像重新啟動每行,不會像重新啟動整個腳本那樣可見。 如果有人找到真正可行的解決方案,我將是第一個支持他的人。

您可以將所有內部if (__name__ == '__main__'):main函數,並留下如下內容:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM