我正在使用Python的flask服务器端代码,其中有一个后台任务,该任务定期运行并执行一个函数(请注意,“定期”不是那么严格,执行一次,然后在x秒后也可以工作)。但是我还需要它在服务器收到请求时立即执行相同的功能(然后恢复后台任务)。
这让我想起了C语言中的 SELECT 系统调用,在该系统中,系统等待超时或直到数据包到达。
这是我在查找许多答案后最少想到的内容。
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()中也有各种数据库更新,我需要注意在轮询和ping之间没有竞争条件。不用说,该函数的一个副本应该在特定时间执行(最好在单个线程中执行)。