定期执行功能或在事件触发时执行

我正在使用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之间没有竞争条件。不用说,该函数的一个副本应该在特定时间执行(最好在单个线程中执行)。

yxsyg 回答:定期执行功能或在事件触发时执行

这是我为您解决的问题的解决方案。我使用了一个优先级队列,该队列接收要通过s = df2.chr.map(df1.set_index('chr').position) df1['Valid'] = df1.chr.map(((s>=df2.start) & (s<=df2.end)).groupby(df2.chr).any()) Out[340]: chr position Valid 0 5 745 False 1 7 963 True 2 8 1024 False 函数运行的数据。后台函数和flask函数是两个不同的线程,它们将数据推入优先级队列,它们应该优先于flask调用优先于后台调用。请注意,现在它如何等待当前线程完成之后再执行另一个线程。

printTime

上面的代码段可能有点冗长,因为我使用了类,但这应该可以帮助您入门。

本文链接:https://www.f2er.com/3136692.html

大家都在问