ThreadPoolExecutor 能否帮助提高单线程应用程序效率



我们想做一个电子商务应用程序,团队是python开发人员,但不使用python web框架(Django/Flask...),因为我们发现Tornado的简单性非常出色,所以我们给了他很大的比例。

但问题是,Tornado 是单线程的,应用程序将使用哈希(登录)和图像处理(缩略图生成)。ThreadPoolExecutor可以扮演像 Apache 这样的多线程服务器的角色吗?

from concurrent.futures import ThreadPoolExecutor
from tornado import gen
from tornado.process import cpu_count
import bcrypt

pool = ThreadPoolExecutor(cpu_count())
@gen.coroutine
def create_user(name, password):
    hashed_pw = yield pool.submit(bcrypt.hashpw, password, bcrypt.gensalt())
    yield save_user(name, hashed_pw)
@gen.coroutine
def login(name, password):
    user = yield load_user(name)
    match = yield pool.submit(bcrypt.checkpw, password, user.hashed_pw)
    if not match:
        raise IncorrectPasswordError()

因此,Tornado 将哈希工作发送到另一个线程,以释放自己并能够接收其他请求。这种方法行得通吗?

注意:还有一个涉及负载均衡器的解决方案,但团队现在不想追求这个解决方案。

是的,ThreadPoolExecutor在这里会很好用。似乎hashpwcheckpw在其操作的 CPU 密集型部分释放 GIL:

bcrypt_hashpw(PyObject *self, PyObject *args, PyObject *kw_args)
{
    ...
    Py_BEGIN_ALLOW_THREADS;
    ret = pybc_bcrypt(password_copy, salt_copy, hashed, sizeof(hashed));
    Py_END_ALLOW_THREADS;
    ...

这意味着您将能够将工作转移到一个 CPU,同时使用另一个 CPU 处理传入的请求。

请记住,如果您需要执行一些运行纯 Python 的其他 CPU 密集型操作(这意味着 GIL 不会被释放),则需要使用ProcessPoolExecutor以避免性能下降。

相关内容

  • 没有找到相关文章

最新更新