Python Flask обновление var после нового запроса - PullRequest
1 голос
/ 09 апреля 2020

Я создал простой скрипт в Python (я новичок). Все работает как нужно, за исключением одной незначительной проблемы.

Мой проект: Я отправляю запрос на свой сервер через http: {ip-of-server} /? Speed ​​= 999 & time = 8 мкс = 50

Это покажет таймер обратного отсчета в вашей оболочке. Отсчет от 8 до 0 в этом случае. Это хорошо работает. Когда я отправлю {ip-of-server} /? Speed ​​= 499 & time = 8 ¢ s = 50, он будет отсчитывать в два раза быстрее. Это по мере необходимости.

Проблема, с которой я сталкиваюсь: Во время обратного отсчета я должен иметь возможность отправить новый запрос на мой сервер. Следует обновить обратный отсчет с новыми значениями. На данный момент будет создано 2 отсчета. Что правильно, если вы читаете сценарий, но не то, что мне нужно. Мне нужна помощь, как просто обновить существующий отсчет.

Мой код:

from flask import Flask, request
app = Flask(__name__)
import time

@app.route('/', methods = ["GET"])

def post():
    speed = float(request.args["speed"])
    thetime = request.args["time"]
    cents = request.args["cents"]

    print('\n')
    print('AccuView Digital:')
    print('Speed:', speed,' Time:', thetime,' Cents:', cents)
    print('-------------------------------')

    def countdown(thetime):
        while thetime:
            mins, secs = divmod(thetime, 60)
            timer = '{:02d}:{:02d}'.format(mins, secs)
            print('Tijd:', timer, end="\r")
            time.sleep((speed+1)/1000)
            thetime -= 1
            if thetime == 0:
                print('Werp geld in\n') 
    countdown(int(thetime))
    return '1'

app.run(host='192.168.1.107', port= 8090)

Спасибо

1 Ответ

0 голосов
/ 09 апреля 2020

Сценарий работает нормально, как вы сказали сами. Так что сейчас происходит то, что flask создает потоки для обслуживания ваших запросов. Вы отправляете 1-й запрос, flask запускает счетчик в одном потоке, а когда вы отправляете другой запрос, flask запускает другой поток, и в этом потоке запускается другой счетчик. Оба потока имеют свои собственные значения speed, thetime и cents, и один поток не может изменить значение переменной в другом потоке.

Поэтому мы хотим получить доступ / изменить значение переменных из любого потока. Одним из простых решений для этого является использование глобальных переменных, чтобы эти переменные были доступны из всех потоков.

Решение:

  1. Make speed, thetime и cents как глобальные переменные, так что они могут изменяться из любого потока.
  2. Когда мы получаем запрос, проверьте, работает ли счетчик (мы можем сделать это, проверив, является ли значение глобальной переменной thetime is 0).
  3. Мы знаем, работает ли существующий счетчик или нет, теперь просто обновите значения глобальных переменных.
  4. Если счетчик не запущен, запустите счетчик (вызов метода countdown()). В противном случае нам ничего не нужно делать (мы уже обновили значения глобальных переменных на предыдущем шаге, поэтому существующий счетчик обновился).

Код:

import time
from flask import Flask, request

app = Flask(__name__)

# We create global variables to keep track of the counter
speed = thetime = cents = 0


@app.route('/', methods=["GET"])
def post():
    global speed, thetime, cents

    # Check if previous counter is running
    counter_running = True if thetime else False

    thetime = int(request.args["time"])
    speed = float(request.args["speed"])
    cents = request.args["cents"]

    print('\n')
    print('AccuView Digital:')
    print('Speed:', speed, ' Time:', thetime, ' Cents:', cents)
    print('-------------------------------')

    def countdown():
        global thetime, speed
        while thetime:
            mins, secs = divmod(thetime, 60)
            timer = '{:02d}:{:02d}'.format(mins, secs)
            print('Tijd:', timer, end="\r")
            time.sleep((speed + 1) / 1000)
            thetime -= 1
            if thetime == 0:
                print('Werp geld in\n')

    # If existing counter is running, then we don't start another counter
    if not counter_running:
        countdown()
    return '1'


app.run(host='192.168.1.107', port= 8090)

Код (чтобы мы могли прервать сон):

import time
import threading
from flask import Flask, request

app = Flask(__name__)

# We create global variables to keep track of the counter
speed = thetime = cents = 0
sleep_speed = threading.Event()


@app.route('/', methods=["GET"])
def post():
    global speed, thetime, cents, sleep_speed

    # Check if previous counter is running
    counter_running = True if thetime else False

    thetime = int(request.args["time"])
    speed = float(request.args["speed"])
    cents = request.args["cents"]

    # Make sure to interrupt counter's sleep
    if not sleep_speed.is_set():
        sleep_speed.set()
    sleep_speed.clear()

    print('\n')
    print('AccuView Digital:')
    print('Speed:', speed, ' Time:', thetime, ' Cents:', cents)
    print('-------------------------------')

    def countdown():
        global thetime, speed
        while thetime:
            mins, secs = divmod(thetime, 60)
            timer = '{:02d}:{:02d}'.format(mins, secs)
            print('Tijd:', timer, end="\r")
            sleep_speed.wait((speed + 1) / 1000)
            thetime -= 1
            if thetime == 0:
                print('Werp geld in\n')

    # If existing counter is running, then we don't start another counter
    if not counter_running:
        countdown()
    return '1'


app.run(host='0.0.0.0', port=8090)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...