2012-06-05 31 views
5

tôi có ứng dụng này Flask đơn giản:Flask và Web.py cả treo trên atexit

from flask import Flask 
import prolog_handler as p 

app = Flask(__name__) 
app.debug = False 

@app.route('/') 
def hello(): 
    for rule in p.rules: 
     print rule 
    return 'hello' 

if __name__ == '__main__': 
    app.run(host='0.0.0.0', port=8080) 

Module prolog_handler bắt đầu một phiên làm việc với một triplestore và tải một số quy tắc. Nó cũng có một chức năng atexit kết thúc phiên và in một thông báo như "Đóng ...". Tôi khởi động máy chủ từ dấu nhắc bash với python myapp.py. Bất cứ khi nào tôi nhấn CTRL-C để dừng máy chủ, không có gì xảy ra. Tôi không được trả lại dấu nhắc bash, và tôi không thấy thông báo "Đóng ..." được in. Tôi cũng đã cố gắng làm điều này với Web.py với cùng một kết quả.

Các prolog_handler mà không là nghĩa đen đơn giản như này:

tstore = openPrologSession() 
rules = ... 

def cleanUp(): 
    print "Closing..." 
    tstore.endSession() 

atexit.register(cleanUp) 

Vậy tại sao là nó quá khó để chỉ cần thực hiện một nhiệm vụ atexit?

PS: nếu tôi nhận xét tất cả nội dung về việc mở Phiên Prolog và kết thúc, và chỉ để lại phần in thông báo "Đóng ..." thì tôi thấy thông báo "Đang đóng ..." khi Tôi nhấn CTRL-C và tôi trở lại dấu nhắc bash. Điều đó hoạt động như mong đợi. Nhưng điểm bất lợi là gì nếu tôi không thể làm bất cứ điều gì hữu ích với nó?

Trả lời

6

Điều này có thể không phải là câu trả lời hoàn hảo nhưng tôi đã cố gắng để sử dụng sau đây cho Flask:

# These functions should be called when you tear down the application 
app.teardown_functions = [] 

def teardown_applications(): 
    for func in app.teardown_functions: 
     print('Calling teardown function %s' % func.__name__) 
     func() 

app.teardown_functions.append(function_tocall_at_exit) 

Điều này dường như làm việc cho tôi. Tôi cũng có xu hướng sử dụng gevent cho tất cả các ứng dụng bình

if __name__ == '__main__': 
    gevent.signal(signal.SIGINT, teardown_applications) 
    http_server = WSGIServer(('', 5000), app) 
    http_server.serve_forever() 

Điều này thường phù hợp với tôi.

Một số hàng nhập khẩu mô-đun:

from flask import Flask 
from gevent.wsgi import WSGIServer 
import gevent 
import signal 

from gevent import monkey 
monkey.patch_all() 
+0

Aha! Người đàn ông tuyệt vời, cảm ơn! –

+0

@ John Peter Thompson Garcés: Cảm ơn. Kiểm tra xem điều này có phù hợp với bạn hay không. – pyfunc

+0

Đúng, nó hoạt động như mong đợi! –