0

我是燒瓶的新手。我需要在燒瓶中實現連接池,以下是我的軟件堆棧: 1. Flask - 0.12.2 2. Python版本 - 3.4.3 3. Python couchbase驅動程序版本 - 2.2.1 4. Couchbase版本 - 4.5.0-2601 Community Edition(build-2601)連接在使用couchbase作爲數據庫的瓶中進行池化

我的要求是 - 在服務器啓動時 - 在每'n'秒後重復運行3-4個進程,即某些進程每隔1秒運行一次,每5秒運行一次等等。我使用python中的「線程」模塊來執行運行這些並行進程。 我不想創建&用於上述工藝緊密聯繫,所以創建所需的連接到couchbase桶在燒瓶如下啓動: (下面的代碼線是「app.py」文件)

cbBkt1Conn = Couchbase.connect(host=<host_name>, 
bucket=<bucket1>, password=<bucket1Password>) 
cbBkt2Conn = Couchbase.connect(host=<host_name>, 
bucket=<bucket3>, password=<bucket3Password>) 
cbBkt3Conn = Couchbase.connect(host=<host_name>, 
bucket=<bucket3>, password=<bucket3Password>) 

但是,當瓶3-4運行出現以下異常後啓動:

File "/usr/local/lib/python3.4/dist-packages/couchbase/n1ql.py", line 384, 
in __iter__ 
    self._start() 
File "/usr/local/lib/python3.4/dist-packages/couchbase/n1ql.py", line 297, 
in _start 
cross_bucket=self._params.cross_bucket) 

couchbase.exceptions.ObjectThreadError: <Couldn't lock. If LOCKMODE_WAIT 
was passed, then this means that something has gone wrong internally. 
Otherwise, this means you are using the Connection object from multiple 
threads. This is not allowed (without an explicit lockmode=LOCKMODE_WAIT 
constructor argument, C Source=(src/oputil.c,428)> 

在進一步的調查,我發現,自從我使用相同的連接對象交流羅斯多線程,這是不允許的(按照上面的錯誤跟蹤下面&鏈接):

http://docs.couchbase.com/sdk-api/couchbase-python-client-2.2.1/api/threads.html

的鏈接建議使用「線程」和「LOCKMODE_WAIT」選項,但這失敗的全部目的。

我也碰到SQLAlchemy的,但是這並不支持couchbase

查詢: 1)如何實現在瓶連接池? 請引導我一個例子/參考來實現這一點。

謝謝, Sachin Vyas。

回答

0

你最好在線程環境中創建新的連接。 (也許想想爲什麼你不想分享開始)。

最好把連接想象成一箇舊式的房子線。如果有人在起居室接聽並撥號,那麼任何想在同一線路上打電話的人都將收到相同的對話。如果他拿起電話開始叫比薩餅,那麼使用手機的人就會中斷,他不會拿到比薩餅。

有兩種選擇:要麼使用房子的第二個人需要等待線路空閒,或者爲房子中的每個人開啓新的連接。

+0

我會注意到,在Couchbase Python客戶端中,我們在入口處解鎖GIL,並且我們可以管道多個操作入隊,認爲IO循環在該特定情況下只驅動一次。通常與Couchbase,我們確實建議分享客戶,但有很多因素。 –