在后台执行python脚本,同时返回dialogflow响应(python Flask)

在后台执行python脚本,同时返回dialogflow响应(python Flask),python,multithreading,flask,dialogflow-es,dialogflow-es-fulfillment,Python,Multithreading,Flask,Dialogflow Es,Dialogflow Es Fulfillment,这是python脚本,用于Dialogflow代理的后端。代理具有以下对话结构: 嗨->请输入地址->请输入姓名(浪费时间)->[然后给出旅行时间] 因此,该代理基本上给出了输入地址和固定地址之间的旅行时间(再次使用中的脚本() 另外,请注意,我是在浪费时间,因为Dialogflow代理说,如果我直接尝试在地址之后输出旅行时间,则超过了最后期限。为了克服这个问题,我尝试了线程化,以便在后台计算行程时间,同时,响应返回到dialogflow,它询问用户名,然后输出行程时间 但问题是,DialogF

这是python脚本,用于Dialogflow代理的后端。代理具有以下对话结构:

嗨->请输入地址->请输入姓名(浪费时间)->[然后给出旅行时间]

因此,该代理基本上给出了输入地址和固定地址之间的旅行时间(再次使用
中的脚本()
另外,请注意,我是在浪费时间,因为Dialogflow代理说,如果我直接尝试在地址之后输出旅行时间,则超过了最后期限。为了克服这个问题,我尝试了线程化,以便在后台计算行程时间,同时,响应返回到dialogflow,它询问用户名,然后输出行程时间

但问题是,DialogFlow仍然表示超过了截止日期(在“请输入您的地址”)。我怀疑原因是,尽管python脚本返回webhook,但dialogflow不会显示输出,直到python脚本停止执行。那我怎么克服呢

总而言之,我希望返回请求(
get\u address
action),同时计算旅行时间(再次使用
)并在下一个请求中返回


正如建议的那样,我从
if()
函数中删除了
return{'fulfillmentText':textv}
,将其替换为
return{'followEventInput':'IN_PROGRESS'}
,但它仍然说
截止日期超过了
。正如我前面所说,问题似乎在于,
results()
函数根本没有返回。

您面临的问题是,您的计算任务可能需要超过问题和答案之间最长4秒的对话等待时间。
事实上,一个基本的解决办法就是找个时间买东西,然后问其他问题

在以下交互过程中,您需要检查后台线程是否已完成,然后获取时间。否则,您需要扩展此过程

一种稍微好一点的方法是触发事件(而不是提问):

  • 输入地址
  • webhook被调用
  • 启动后台线程,睡眠3秒,正在触发事件
  • DialogFlow intent I1由正在进行的事件触发,向用户显示一条消息(即正在处理)
  • webhook在intent I1之后调用,休眠3秒,然后检查后台线程状态

您面临的问题是,您的计算任务可能需要超过问题和答案之间对话流等待的最长4秒时间。
事实上,一个基本的解决办法就是找个时间买东西,然后问其他问题

在以下交互过程中,您需要检查后台线程是否已完成,然后获取时间。否则,您需要扩展此过程

一种稍微好一点的方法是触发事件(而不是提问):

  • 输入地址
  • webhook被调用
  • 启动后台线程,睡眠3秒,正在触发事件
  • DialogFlow intent I1由正在进行的事件触发,向用户显示一条消息(即正在处理)
  • webhook在intent I1之后调用,休眠3秒,然后检查后台线程状态

    • 我自己想出来的。问题在于以下语法:
      threade=threading.Thread(target=reach())


      之后不应该再出现
      ()
      ,我自己想出来的。问题在于以下语法:
      
      threade=threading.Thread(target=reach())

      之后不应再出现
      ()

      app = Flask(__name__)
      av=""
      time=""
      action=""
      
      def again():
          ...
      
      @app.route('/')
      def index():
          return 'Hello World!'
      
      def results():
          global action
          req = request.get_json(force=True)
          action = req.get('queryResult').get('action')
          if(action=="get_address"):
              global av
              global time
              av=req.get('queryResult').get('parameters').get('location').get('city')
              threade=threading.Thread(target=again())
              threade.start()
      
              textv="Thanks! Please enter your name now."
              return {'fulfillmentText': textv}
          else:
              textv="Time: " + time
              return {'fulfillmentText': textv}
      
      
      # create a route for webhook
      @app.route('/webhook', methods=['GET', 'POST'])
      def webhook():
          # return response
          return make_response(jsonify(results()))
      
      # run the app
      if __name__ == '__main__':
         app.run()