1

我正在烧瓶,python,sqlalchemy和postgresql上开发web应用程序。 我的问题是关于这个应用程序中的并发处理。基于python的web应用程序中的并发处理

我该如何编写应用程序:

我以在数据库中添加用户为例。我发布表单并调用一个视图。我处理所有表单数据,然后调用add_user(* arg),它使用sqlalchemy代码在数据库中插入用户,并在成功执行时返回并返回视图中的响应。

我以为是什么:

好了,现在我认为我的Web服务器(我还没有决定),要么产生一个线程,或者如果两个用户试图在同一时间注册和将处理过程所有的concurreny要求。

  1. 是否需要在此处编写线程代码?通过线程代码我的意思是,在写入之前,我获得一个锁并在写入释放之后。
  2. 我对网络开发和多线程/多处理编程非常新颖,并希望了解如何编写能够很好地处理并发的web应用程序。
  3. 从start开始编写并发处理是正确的,或者当大量的并发用户使用webapp时,这个想法应该会出现。即使如果它应该在以后做,我想要一些关于它的指针。

基本上我不知道web应用程序开发的并发部分。如果你能指出资源,那么我可以从中了解更多关于它的信息,这将非常有帮助。

回答

5

Flask将在单独的线程中甚至在单独的进程中执行每个请求。产生的线程和进程的数量由WSGI服务器决定(例如Apache使用mod_wsgi)。

如果您使用SQLAlchemy ScopedSessions,则会话完全是线程安全的。你不能在线程间共享ORM控制的对象(但在绝大多数情况下,你不会让对象活得比请求长,所以这通常不是问题)。

换句话说,只要您不打算通过数据库或cookie之外的其他请求共享状态,则无需担心并发问题。您不需要创建写入数据库的锁。

如果您在您的应用程序中创建了自己的长期对象,而这些对象很可能不需要做,并且这些对象与请求处理代码进行通信或共享状态,则必须采取适当的预防措施以避免同步问题(竞态条件,死锁,使用非线程安全的库等)

+0

在http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading中解释mod_wsgi会发生什么 – 2012-03-02 01:15:16

+0

@ jd通过在请求之间共享状态,你的意思是什么?我将当前用户的sqlalchemy对象保留在用户会话中,并在下次请求时将其与当前sqlalchemy会话再次合并。它是共享状态吗? – codecool 2012-03-02 16:06:38

+0

如何将SQLAlchemy对象*保存在*会话中?我们在讨论什么样的会议?一个签名的cookie? 如果你的会话是一个签名的cookie,并且需要引用一个数据库对象,那么它应该可能存储该对象的ID,并根据需要从DB中检索对象。 – 2012-03-02 16:32:49