Я работаю над кодом 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)
Вывод:

Но вывод ясно говорит о том, что он не работает должным образом после того, как есть запрос (отправлено с использованием curl -X POST http://localhost:5001/ping
)
Пожалуйста, направьте меня каккак это исправить или есть ли другие способы сделать это. Просто к вашему сведению, в исходном коде есть различные обновления базы данных в pollAndExecute () , а также я должен позаботиться о том, чтобы между опросом и пингом не было условий гонки. Излишне говорить, что только одна копия функции должна выполняться в определенное время (предпочтительно в одном потоке).