【问题标题】:number of threads in flask烧瓶中的线程数
【发布时间】:2019-12-13 10:22:50
【问题描述】:

我只是了解烧瓶和请求。当我向服务器发布请求时,我想获取工作线程的数量。我想测量工作线程所花费的时间。所以这是我的服务器和我的客户端代码:

server.py

from flask import Flask
from flask import request
import time 
from flaskthreads import AppContextThread

app = Flask(__name__)

@app.route("/", methods = ['GET', 'POST'])

def home():
    timeout = time.time() + 10   # 5 minutes from now

    while True:
        test = 0
        if test ==5 or time.time() > timeout:
            break 

    return 'Hello', 200

def main():
    app.run(host='0.0.0.0', threaded = True, debug = True)


if __name__ == "__main__":
    main()

client.py

import os
import requests
import glob
import time 
import base64


url = 'http://0.0.0.0:5000/'


def load_data():

    os.chdir('./500_mb')
    for image in glob.glob('*.jpg'):
        with open(image, 'rb') as imageFile:
            # image_s = base64.b64encode(imageFile.read())
            image_s = {'file_image':open(image, 'rb')}

    return image_s

def send_data():

    start = time.time()
    r = requests.post(url, files = load_data())
    end = time.time()

    print('client 1: {} ms'.format((end - start)*1000))



if __name__ == "__main__":
    send_data()

我怎么知道工作线程的数量?我只是在服务器上添加threaded = True。我一直在寻找答案,但没有人回答我的问题。提前致谢!

【问题讨论】:

    标签: python multithreading flask


    【解决方案1】:

    首先,通常的免责声明:这几乎无关紧要,因为您可以在实际移动到deployment server 时指定它。

    不过,我自己也很好奇,所以我决定追溯一下。

    起点在app.run(),让我们看看它做了什么:

    def run_command(
        info, host, port, reload, debugger, eager_loading, with_threads, cert, extra_files
    ):
    
    ...
    
    from werkzeug.serving import run_simple
    
        run_simple(
            host,
            port,
            app,
            use_reloader=reload,
            use_debugger=debugger,
            threaded=with_threads,
            ssl_context=cert,
            extra_files=extra_files,
        )
    

    所以,下一个停靠港是werkzeug.serving with run_simple

    从这里开始,您会对该模块感到震惊:

    1. 首先你会看到它使用了make_server
    2. make_server 启动 ThreadedWSGIServer
    3. ThreadedWSGIServer 将socketserver.ThreadingMixIn 作为参数。

    前往socketserver。我们可以从the source code看到以下内容:

    class ThreadingMixIn:
        """Mix-in class to handle each request in a new thread."""
    
        ...
    
        def process_request(self, request, client_address):
            """Start a new thread to process the request."""
            t = threading.Thread(target = self.process_request_thread,
                                 args = (request, client_address))
            t.daemon = self.daemon_threads
            if not t.daemon and self.block_on_close:
                if self._threads is None:
                    self._threads = []
                self._threads.append(t)
            t.start()
    

    所以,答案是它在每个请求上启动一个新线程。如果不出意外,这是一个跟踪代码路径的有趣练习。


    2021 年 9 月编辑:我最初犯的错误是没有从 git 获取永久链接,因此答案的不同部分与我试图显示的代码路径不同步。我已经更正了这一点,以尝试使永久链接更加稳定,但是由于涉及到多个库,请注意事情可能随时发生变化。不过,我认为一般原则会持续一段时间。

    【讨论】:

      猜你喜欢
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      相关资源
      最近更新 更多