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