为什么烧瓶不按正确的顺序显示控制台日志?

时间:2016-05-19 06:37:55

标签: python multithreading http flask

我有一个基本的烧瓶应用程序,其中一个路由调用一个新线程并返回如下:

@app.route("/beginDelivery", methods=["POST"])
def begin_delivery():
if request.get_json(force=True):
    js = request.json
else:
    return jsonify(status=wrong_json())

pid = js['pid']

Thread(target=asynchronously_deliver, args=[pid]).start()
return jsonify(status=0)

现在,在我的asynchronously_deliver函数中,有一个调用send_sms函数的循环。 send_sms没有任何循环,它的结尾如下:

#....
#....
print("sending sms...")
rb = urllib.request.urlopen("someurl").read()
rsp = str(rb.decode('utf-8'))

if rsp[0] == '0' and rsp[1] == '0' and rsp[2] == '0' and rsp[3] == '0':
    provider_id = rsp[7:]
    print("provider: success")
else:
    provider_id = '0'
    print("provider: error")
return provider_id

现在,问题是,当我检查控制台时,有时候,而不是

sending sms...
127.0.0.1 - - [19/May/2016 10:16:54] "GET /someurl HTTP/1.1" 200 -
provider: success

我得到了

sending sms...
provider: success
127.0.0.1 - - [19/May/2016 10:16:56] "GET /someurl HTTP/1.1" 200 -

由于某种原因,在send_sms print中执行urllib.request.urlopen("someurl").read()之前的sleep(10)的意思。

可能是什么原因?

修改

我在/someurl路线中添加了sending sms...provider: success127.0.0.1 - - [19/May/2016 11:32:06] "GET /someurl 之间有10秒的延迟。虽然,考虑一下:

provider:success

直到10秒后才打印,就在rb = urllib.request.urlopen("someurl").read()之前,因此,在请求完成并返回响应之前,flask不会将消息发送到控制台。此外,这意味着(我认为)pivot 异步调用。我错了吗?

0 个答案:

没有答案
相关问题