我用flask framework和psycopg 2构建了一个python编写的web服务器,我对并发处理有一些疑问,因为它与dbs和服务器本身有关,我用gunicorn启动我的web:gunicorn app:app
应用程序。
据我所知,像这样的Web服务器一次处理一个请求。因此,如果有人向服务器发出get或post请求,服务器必须完成对该get或post请求的响应,然后才能继续处理另一个请求。如果是这种情况,那么我为什么需要创建多个连接游标对象呢?例如,如果有人发出一个post请求,要求我更新数据库中的某些内容,那么我的服务器就不能处理请求,直到我从post端点返回为止,这样一个连接对象就不会瓶颈了,是吗?
最后,我试图让我的服务器同时处理大量的请求。为了做到这一点,我想我首先必须创建我的服务器的多个示例,然后连接池开始发挥作用,对吗?我想为了创建我的服务器的多个示例(如果这里使用了错误的术语,请道歉),我会做以下事情之一:
一种办法是:我需要使用多个线程,如果应用程序部署在云中的计算机具有多个CPU核心,那么它可以做到这一点然而,我读到过python不支持“真正的多线程”,这意味着多线程程序实际上并不是并发运行的,它只是在这些线程之间快速地来回切换。那么这真会和我现在的设置有什么不同吗?
第二种方式:使用多个gunicorn工作者,或者使用多个dynos。我认为这条路线是这里的解决方案,但是我根本不理解如何设置它的理论。如果我产生额外的gunicorn工作者,幕后会发生什么?这一切仍然会在我的heroku应用程序示例上运行吗?我在heroku上可以访问的内核数量会影响这一点吗?另外,无论我选择哪种方式,我希望在www.example.com代码中更改什么app.py,还是仅在procfile中进行更改?
假设我设法设置了多线程或gunicorn worker,那么这将如何影响连接池的设置/我应该如何处理连接池?如果任何熟悉这一点的人可以帮助提供一些理论或解释或一些资源,我将不胜感激。谢谢大家!
1条答案
按热度按时间7cwmlq891#
从我使用python的经验中,我学到了......
1.如果使用多线程或异步,则需要使用池或异步连接
1.如果您有多个进程,并且您的代码是严格同步的,没有线程,则不需要池。您可以为每个进程重用单个连接,因为它们彼此之间不共享。
1.在python中,线程通常不会加快执行速度,因为python一次只能运行一个线程,不过如果线程需要阻塞,线程可以帮助加快执行速度。
1.对于Web服务器来说,真正的瓶颈通常是IO,这意味着连接到数据库或读取文件或w.e.多个进程并使这些进程异步提供了最佳性能。Starlette是Flask的异步版本...有点像,如果设置正确并使用异步库,通常会快得多