2014-09-27 37 views
1

我有一個作爲守護進程運行的Python腳本。在啓動時,它會產生5個進程,每個進程都連接到Postgres數據庫。現在,爲了減少數據庫連接的數量(最終會變得非常大),我試圖找到跨多個進程共享單個連接的方法。爲此,我正在查看multiprocessing.sharedctypes.Value API。但是,我不知道如何跨進程傳遞使用此API的psycopg2.connection對象。誰能告訴我怎麼做?在Python中跨進程共享連接到postgres db

我也打開其他想法來解決這個問題。

我不考慮將連接作爲構造函數的一部分傳遞給5個進程的原因是互斥排除處理。我不確定如果遵循這種方法,我可以如何阻止多個進程訪問連接。有人能告訴我這是否正確嗎?

+1

目前尚不清楚你在這裏尋找什麼。 5個連接當然不是問題。你是說你最終可能需要產生100個或1000個進程,每個進程都有自己的連接?如果是這樣,即使您可以共享它們,它們也會綁定到連接池,因爲在任何給定的時間只有一個進程可以使用給定的連接。 – khampson 2014-09-27 05:19:17

回答

5

您不能在這樣的進程之間共享數據庫連接。您可以排序共享線程之間的連接,但前提是您確保連接一次只能由一個線程使用。這在進程之間不起作用,因爲存在客戶端地址空間中的連接存在客戶端狀態。

如果您需要大量併發工作人員,但他們並未始終使用數據庫,那麼您應該有一組數據庫工作人員處理所有數據庫訪問並與其他工作進程交換數據的進程。每個數據庫工作進程都有一個DB連接。其他進程只能通過數據庫工作人員與數據庫進行通信。

Python的多處理隊列,fifo等提供了適當的消息傳遞功能。

+0

您的第二句似乎與[說](http://initd.org/psycopg/docs/usage.html#thread-and-process-safety)的psycopg2文檔相沖突:_many線程可以使用單獨的方式訪問相同的數據庫會話並創建每個線程的連接或使用相同的連接並創建單獨的遊標_。你能澄清嗎? – max 2016-11-08 08:37:25

+0

psycopg2有一個互鎖,允許多個線程共享一個連接,防止他們同時使用它。對於併發工作者來說,訪問數據庫非常沒用,因爲在任何給定的時間,只有一個線程在等待。但是,如果您有許多需要偶爾訪問數據庫的工作人員,這很方便。你很對,後者是專用數據庫工作池的替代品。 – 2016-11-09 00:36:30

+0

這是有道理的。我想,你基本上也回答了[我的其他問題](http://stackoverflow.com/questions/40478896/reusing-database-connection-for-multiple-requests)。 – max 2016-11-09 03:58:30