【问题标题】:Execute python script in background, while dialogflow response is sent back (Python Flask)在后台执行 python 脚本,同时返回对话流响应(Python Flask)
【发布时间】:2020-05-07 08:01:23
【问题描述】:
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()

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

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

所以这个代理基本上给出了输入的地址和固定地址之间的旅行时间(使用again()中的脚本) 另外,请注意我在浪费时间,因为如果我直接尝试在地址之后输出旅行时间,Dialogflow 代理会说,已超过截止日期。所以为了解决这个问题,我尝试了线程,以便在后台计算行程时间,同时将响应返回到对话流,询问用户的姓名,然后输出行程时间。

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

总结一下,我希望请求返回(get_address action),同时计算行程时间(使用again())并在下一个请求中返回。

按照建议,我从 if()results() 函数的一部分中删除了 return {'fulfillmentText': textv},并将其替换为 return {'followupEventInput': 'IN_PROGRESS'},但它仍然显示为 DEADLINE_EXCEEDED。正如我之前所说,问题似乎在于results() 函数根本没有返回。

【问题讨论】:

    标签: python multithreading flask dialogflow-es dialogflow-es-fulfillment


    【解决方案1】:

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

    again后面不应该有()

    【讨论】:

      【解决方案2】:

      您面临的问题是您的计算任务可能需要超过 DialogFlow 在问题和答案之间等待的最长 4 秒。
      事实上,一个基本的解决方案是在某个时候购买,问其他问题。

      在接下来的交互过程中,您需要检查后台线程是否完成,然后获取时间。否则你需要扩展这个过程。

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

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

      【讨论】:

        猜你喜欢
        • 2011-01-01
        • 2023-03-23
        • 1970-01-01
        • 2014-12-18
        • 2016-09-30
        • 2015-10-23
        • 2022-06-18
        • 2019-04-05
        • 2018-01-22
        相关资源
        最近更新 更多