Как остановить выполнение через некоторое время?

#python #python-3.x #plotly #plotly-dash

#python #python-3.x #сюжет #plotly-dash

Вопрос:

Я хочу остановить выполнение моей программы Dash через определенное время (еще лучше, когда я закрываю окно браузера, хотя я сомневаюсь, что это возможно). Есть ли способ прервать его через python?

Я уже пытался поместить

 sys.exit() 
  

после вызова app.run_server . Хотя, насколько я понимаю app.run_server , выполняется код в бесконечном цикле, поэтому я никогда не достигаю sys.exit() .

 if __name__ == '__main__':
    app.title = 'foo'
    app.run_server(debug=False)
    sys.exit("Bye!")
  

Ответ №1:

Поскольку plotly используется flask для сервера. Таким образом, ваш код sys.exit("Bye!") фактически никогда не достигается, следовательно, ваш сервер никогда не останавливается. Итак, есть 2 способа остановить ваш сервер,

  • Ctrl c, который, я полагаю, вы будете делать сейчас

  • Теперь вы можете сделать это и с помощью кода, поэтому, если вам действительно нужно остановить код через некоторое время, вы должны остановить сервер flask. Чтобы остановить сервер flask, вам нужно создать маршрут. Поэтому всякий раз, когда вы нажимаете на этот URL, сервер останавливается.

Следующий код предназначен для Flask, вам нужно преобразовать его в эквивалентный плотный код:

 from flask import request

def shutdown_server():
    func = request.environ.get('werkzeug.server.shutdown')
    if func is None:
        raise RuntimeError('Not running with the Werkzeug Server')
    func()
  

Теперь вы можете завершить работу сервера, вызвав эту функцию:

 @app.route('/shutdown', methods=['POST'])
def shutdown():
    shutdown_server()
    return 'Server shutting down...'
  

Обновить:
Для plotly вы можете написать код следующим образом.

 import dash
import dash_core_components as dcc
import dash_html_components as html
from flask import request

print(dcc.__version__) # 0.6.0 or above is required

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div([
    # represents the URL bar, doesn't render anything
    dcc.Location(id='url', refresh=False),

    dcc.Link('Navigate to "/"', href='/'),
    html.Br(),
    dcc.Link('Navigate to "/page-2"', href='/page-2'),

    # content will be rendered in this element
    html.Div(id='page-content')
])

def shutdown():
    func = request.environ.get('werkzeug.server.shutdown')
    if func is None:
        raise RuntimeError('Not running with the Werkzeug Server')
    func()

@app.callback(dash.dependencies.Output('page-content', 'children'),
              [dash.dependencies.Input('url', 'pathname')])
def display_page(pathname):
    if pathname =='/shutdown':
        shutdown()
    return html.Div([
        html.H3('You are on page {}'.format(pathname))
    ])


if __name__ == '__main__':
    app.run_server(debug=True)
  

Комментарии:

1. Спасибо за быстрый ответ, однако я получаю следующую ошибку атрибута: объект ‘Dash’ не имеет атрибута ‘route’

2. Извините, я дал вам синтаксис для flask. Вам нужно преобразовать код в plotly dash.plot.ly/urls

3. @wieli99 Не уверен. Но я думаю, что ваша первая проблема теперь решена. вы можете завершить работу приложения.

Ответ №2:

 def button():
        button_reply = QMessageBox.question(MainWindow, "Bank Management System", "Deposited Successfully", QMessageBox.Ok)
        if button_reply == QMessageBox.Ok:
            Deposit()//execute deposite function first
            threading.Timer(5.0,clearData).start()// clrarData function will execute after 5 seconds