2

我正在 python 烧瓶网络服务器中创建一个聊天机器人。我有这个功能可以向 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() 的执行

4

2 回答 2

0

我建议您通过“等待响应”消息从您的机器人发送同步响应。您可以按照Narendra的建议generateresponse()创建一个线程来运行,这样当它返回时,它会向聊天室发送一个异步消息,并提供所需的结果。请参阅GitHub 上来自 Google 的这个 Flask 异步示例——它没有线程,但确实向您展示了如何(使用服务帐户)将异步消息发布到聊天室。runapi()

于 2018-05-27T05:28:51.450 回答
0

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

看这个例子:

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()

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

于 2018-05-25T16:25:53.550 回答