gpt4 book ai didi

python - : asynchronous request handler with blocking tasks handled by worker pool的表现

转载 作者:行者123 更新时间:2023-11-28 17:48:31 27 4
gpt4 key购买 nike

这个脚本的性能如何:http://tornadogists.org/2185380/复制如下。

from time import sleep
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.web import Application, asynchronous, RequestHandler
from multiprocessing.pool import ThreadPool

_workers = ThreadPool(10)

def run_background(func, callback, args=(), kwds={}):
def _callback(result):
IOLoop.instance().add_callback(lambda: callback(result))
_workers.apply_async(func, args, kwds, _callback)

# blocking task like querying to MySQL
def blocking_task(n):
sleep(n)
return n

class Handler(RequestHandler):
@asynchronous
def get(self):
run_background(blocking_task, self.on_complete, (10,))

def on_complete(self, res):
self.write("Test {0}<br/>".format(res))
self.finish()

HTTPServer(Application([("/", Handler)],debug=True)).listen(8888)
IOLoop.instance().start()
  1. 我的应用程序将超过 1,000 个请求/秒
  2. 每个请求将持续 2-30 秒,平均约 6 秒
    • 简单地平均 sleep(6)
  3. 使用 redis BLPOPQueue.get_nowait() 之类的东西来阻止 IO

最佳答案

整体模式很好,但需要注意的是,由于 GIL,您的线程池将只能使用单个 CPU,您需要使用多个进程才能充分利用可用的硬件。

仔细查看这些数字,如果您的请求真的平均每个请求耗时 6 秒,那么 10 个线程太小了。你每秒有 6000 秒的工作量,所以你需要在所有进程中总共至少有 6000 个线程(假设这 6 秒真的只是阻塞外部事件和 python 进程中的 CPU 成本可以忽略不计)。我不确定现代系统可以处理多少个线程,但 6000 个 Python 线程听起来不是个好主意。如果每个请求确实有 6 秒的阻塞(以及数千个请求/秒),那么将这些阻塞函数转换为异步函数听起来是值得的。

关于python - : asynchronous request handler with blocking tasks handled by worker pool的表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14306360/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com