![](/img/trans.png)
[英]How to prevent a block of code from being interrupted by KeyboardInterrupt in Python?
[英]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.