Выполнять функцию периодически или при возникновении события - PullRequest
4 голосов
/ 08 ноября 2019

Я работаю над кодом Python на стороне сервера, где есть фоновая задача, которая периодически запускается и выполняет функцию (обратите внимание, что 'периодически' не так жестко, выполняется один раз, а затем через x секунд также работает). Но мне также нужно, чтобы она выполняла ту же функцию немедленно, когда сервер получает запрос (а затем возобновляет фоновую задачу).

Этот вид напоминает мне системный вызов SELECT в Cгде система ожидает тайм-аут или пока не прибудет пакет.

Вот что я нашел минимально после просмотра большого количества ответов.

from flask import Flask, request
import threading, os, time

POOL_TIME = 2

myThread = threading.Thread()

def pollAndExecute(a='|'):
    time.sleep(1)
    print(time.time(), a)
    # time.sleep(1)
    myThread = threading.Timer(POOL_TIME, pollAndExecute)
    myThread.start() 

def startWork():
    global myThread
    myThread = threading.Timer(POOL_TIME, pollAndExecute)
    myThread.start()

app = Flask(__name__)

@app.route('/ping', methods=['POST'])
def ping():
    global myThread
    myThread.cancel()
    pollAndExecute("@")
    return "Hello"

if __name__ == '__main__':
    app.secret_key = os.urandom(12)
    startWork()
    app.run(port=5001)

Вывод:

Output

Но вывод ясно говорит о том, что он не работает должным образом после того, как есть запрос (отправлено с использованием curl -X POST http://localhost:5001/ping)

Пожалуйста, направьте меня каккак это исправить или есть ли другие способы сделать это. Просто к вашему сведению, в исходном коде есть различные обновления базы данных в pollAndExecute () , а также я должен позаботиться о том, чтобы между опросом и пингом не было условий гонки. Излишне говорить, что только одна копия функции должна выполняться в определенное время (предпочтительно в одном потоке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...