运行时警告:从未等待过协程“some_xyz_method”

时间:2021-01-13 05:48:23

标签: python asynchronous flask

在方法 1 中,我希望先执行 try 块,然后再执行 call_ordercreate 方法,尝试使用 asyncio 但得到如描述中所示的错误输出,我该如何解决此问题?

方法#1

<?php
$str = "size:3|order_by:date|order:ASC|post_type:post";
$arr = array_reduce(explode('|', $str), function ($carry, $item) {
    $itemArr = explode(':', $item);
    if (count($itemArr) == 2) {
        $carry[$itemArr[0]] = $itemArr[1];
        return $carry;
    }
}, []);

print_r($arr);

方法#2


@app.route("/slack/message_actions", methods=[ "POST" ])
def message_actions():

        if (payload[ "type" ] == "view_submission" and payload[ "view" ][ "callback_id" ] == "sthpush"):
            print("entered push")
            call_ordercreate(thread_ts, user_name)  **# Run this method after executing try block** 
            try:
                return jsonify(
                    {
                        "response_action": "push",
                        "view": orderwaitmessage,
                    }
                )
            except SlackApiError as e:
                code = e.response[ "error" ]
                return make_response(f"Failed to open a modal due to {code}", 200)

错误输出

async def call_ordercreate(thread_ts, user_name):
    await asyncio.sleep(4)
    url_list1 = CONST_ORDERCREATE_API  
    r = requests.get(url)

1 个答案:

答案 0 :(得分:0)

这里的问题是你试图从一个普通的同步函数调用一个异步函数。您应该使用 asyncio.run 方法来运行该函数。这不会引发 RuntimeWarning。所以你的代码看起来像这样:

@app.route("/slack/message_actions", methods=[ "POST" ])
def message_actions():

        if (payload[ "type" ] == "view_submission" and payload[ "view" ][ "callback_id" ] == "sthpush"):
            print("entered push")
            asyncio.run(call_ordercreate(thread_ts, user_name))
            try:
                return jsonify(
                    {
                        "response_action": "push",
                        "view": orderwaitmessage,
                    }
                )
            except SlackApiError as e:
                code = e.response[ "error" ]
                return make_response(f"Failed to open a modal due to {code}", 200)

但是,您似乎想在将响应返回给用户后运行 call_ordercreate。恐怕这是不可能的,因为一旦您return,整个请求上下文就会被破坏。此外,flask(我假设它的flask)是一个WSGI 服务器,这意味着它以同步方式处理请求。这就是为什么使用 asyncio.run 是调用异步函数的唯一方法。不足之处?它等待任务完成,这绝对不是你想要的。