bugfix> python > 投稿

Pythonフラスコ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()の実行を一時停止することなく 'waiting'メッセージを返すことができるようにしたいだけです。

回答 2 件
  • 私の知識として、スレッドを使用してある時点の後に関数を呼び出すことができます

    この例を参照してください。

    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() を介したボットからの応答  「応答待ち」メッセージが表示されます。ナレンドラが runapi() を実行するよう提案したように、スレッドを作成できます。  返されると、非同期 目的の結果を含むチャットルームへのメッセージ。 GitHubでのGoogleのFlask非同期の例を参照してください。スレッドはありませんが、非同期のメッセージをチャットルームに投稿する方法(サービスアカウントを使用)を示しています。

あなたの答え