2013-08-28 55 views
2

我有一個應用程序通過TCP連接接收數據並將其寫入postgres數據庫。然後,我使用django web前端爲這些數據提供gui。由於django提供了有用的數據庫訪問方法,我的TCP接收器也使用django模型寫入數據庫。分叉Django數據庫連接

我的問題是我需要使用分叉的TCP服務器。在子進程和父進程中共享句柄的分叉結果。我讀過Django不支持分叉,而且實際上共享數據庫連接導致了問題,例如這些異常:

DatabaseError:SSL錯誤:解密失敗或不良記錄MAC

InterfaceError:連接已經關閉

什麼是使分叉TCP服務器工作的最佳解決方案?

  • 我可以確保分叉進程使用自己的數據庫連接嗎?
  • 我應該看看其他模塊寫入postgres數據庫嗎?
+0

什麼問題,你確切地解決與分叉? –

+0

我的主要原因是速度和韌性。該服務器正在處理大量數據,並且線程切換在一分鐘內是一個限制。多進程意味着沒有GIL問題(我知道套接字操作在釋放GIL時阻塞,但後處理一次只能在一個線程中發生)。 – Dave

+0

我會通過eventlet或gevent使用綠色線程,除非您嚴重受CPU限制。 eventlet和gevent都有機制讓Postgres在很多併發連接上表現出色。這是一個選擇嗎? –

回答

0

libpq驅動程序,這就是通常使用的Django的psycopg2驅動程序是建立在,不支持分叉的活動連接。我不確定是否可能有另一個驅動程序沒有,但我不會假設 - 協議不支持在同一連接上多路複用多個會話。

問題的正確解決方案是確保每個分叉進程使用自己的數據庫連接。最簡單的方法通常是等待打開連接,直到分叉後。

+0

是的,但問題是如何確保每個分支進程使用自己的數據庫連接。我有一個特定的情況,數據庫連接必須在fork之前打開。我想答案是直接使用psycopg2,這樣我可以明確地控制這個,而不是讓Django管理連接。 – Dave

1

所以我找到的一個解決方案是創建一個新的線程產卵。 Django爲每個線程打開一個新連接,以便從新線程產生,以確保您將新連接傳遞給新進程。

回想起來,我希望我從頭開始使用psycopg2,而不是Django。 Django非常適合Web前端,但對於獨立應用程序來說並不是那麼好,因爲我使用它的只是模型層。使用psycopg2可以更好地控制何時關閉和打開連接。不僅僅是因爲分叉問題,而且我還發現Django沒有保持持續的postgres連接 - 我們應該在1.6版發佈時更好地控制它,並且應該爲我的特定應用程序提供巨大的性能提升。另外,在這種類型的應用程序中,我發現Django有意泄漏 - 可以使用DEBUG將其設置爲False來解決某些問題。然後再次,我寫了現在的應用程序:)