Вызов API занимает слишком много времени, чтобы ответить.Как я могу передать управление от этой функции и вернуться позже - PullRequest
0 голосов
/ 25 мая 2018

Я создаю чат-бота на веб-сервере python flask.У меня есть эта функция, которая отправляет запрос в 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 вызывает API mulesoft для возврата результата.Однако на некоторые запросы требуется больше времени.Я хочу вернуть текст - «жду ответа» обратно в чат-бота (если я не получаю никакого ответа от runapi () в течение 30 секунд) и продолжаю выполнять runapi, пока он не вернет вывод.Как я могу это сделать?
Я не хочу, чтобы ответ не поступал. Я только хочу, чтобы до 30 секунд generateresponse () мог возвращать сообщение "ожидание", не останавливая выполнение runapi ()

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Я предлагаю вам отправить синхронный ответ от вашего бота через generateresponse() с сообщением "в ожидании ответа".Вы можете создать поток как Narendra , предлагаемый для запуска runapi(), чтобы при возврате он отправлял асинхронное сообщение в чат с желаемыми результатами.См. этот пример асинхронизации Flask от Google на GitHub - он не имеет потоков, но показывает, как (использовать служебную учетную запись для) публиковать асинхронные сообщения в чат-комнате.

0 голосов
/ 25 мая 2018

Насколько мне известно , вы можете вызвать функцию через некоторое время, используя threading

См. Этот пример:

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

Но вы не можете сначала вернуть какое-то начальное сообщение, а затем, как только вы получите ответ, возвращение вывода невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...