API 调用响应时间过长.如何从此函数传递控件并稍后再回来



我正在python flask Web服务器中创建聊天机器人。我有这个函数,可以将查询发送到 api 并响应聊天机器人。

def generateresponse(command):
#do something
text = runapi(uri) 
return text
def runapi(uri):
r = requests.get(uri, auth=HTTPBasicAuth(user, password))
parsed = js.loads(r.text,object_pairs_hook=OrderedDict)
return parsed
def on_event():
event = request.get_json()  #receives an event from the chatbot
#do something
resp = generateresponse(event)
apiasyncresp(resp, spaceName)
return json.jsonify()

这个runapi方法调用一个mulesoft api来返回结果。但是,响应某些查询需要更长的时间。我想将文本 - "等待响应"返回聊天机器人(如果我在 30 秒内没有收到 runapi(( 的任何响应(并继续执行 runapi,直到它返回输出。我该怎么做?
我不想阻止回应进来。我只希望在 30 秒之前 generateresponse(( 可以返回"等待"消息而不暂停 runapi(( 的执行

据我所知,您可以在一段时间后使用线程调用函数

请参阅此示例:

from threading import Timer
set_time = 1
event = Timer(set_time, hello)
def message():
t.cancel()
return "Waiting for the response"
def api():
event.start()
r = requests.get("http://www.satp.org/Timelines.aspx?countries=bangladesh")
t.cancel()
print("finish")
return r
api()

但是,您不能先返回一些初始消息,然后一旦获得响应,就不可能返回输出。

我建议您通过generateresponse()从机器人发送同步响应,并带有"等待响应"消息。您可以按照 Narendra 的建议创建一个线程来运行runapi()以便在它返回时,它会将异步消息发送到聊天室并获得所需结果。在GitHub上查看Google的这个Flask异步示例 - 它没有线程,但确实向您展示了如何(使用服务帐户(将异步消息发布到聊天室中。

最新更新