我正在编写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之间没有竞争条件。不用说,在特定时间只能执行函数的一个副本(最好是在单个线程中)。你知道吗
这是我为你的问题提出的解决办法。我使用了一个优先级队列,它接收要用
printTime
函数运行的数据。background和flask函数是两个不同的线程,它们将数据推送到优先级队列中,从而使flask调用优先于后台调用。注意它现在是如何等待当前线程完成,然后再执行另一个线程的。你知道吗上面的代码片段可能有点冗长,因为我使用了类,但这应该可以让您开始。你知道吗
相关问题 更多 >
编程相关推荐