gpt4 book ai didi

python - ThreadPoolExecutor 能否帮助单线程应用提高效率?

转载 作者:太空宇宙 更新时间:2023-11-04 03:37:33 24 4
gpt4 key购买 nike

我们想做一个电子商务应用,团队是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以避免性能下降。

关于python - ThreadPoolExecutor 能否帮助单线程应用提高效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28243430/

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