1

Stacklesssocket.py で Stackless Python を使用するプロジェクトがあります。私は最近、Couchbase をプロジェクトに追加して、データベースのバックエンドとしてサーバーに追加したいと考えました。( Couchbaseサイト)の指示に従ってこれを行いました。ただし、私のプロジェクトとは互換性がないようです。さらに調査すると、stacklesssocket との衝突のようです。

私のプロジェクトのソースを表示するのは非常に複雑だったでしょうが、私が得たエラーを正確に再現するケースまでコードを要約しました:

import couchbase

# Monkeypatch in the 'stacklesssocket' module, so we get blocking sockets
# which are Stackless compatible.  This example code will avoid any use of
# the Stackless sockets except through normal socket usage.
import stacklesssocket
stacklesssocket.install()
import socket

# connect to a couchbase server
cb = couchbase.Server('localhost:8091', username='username', password='password')

# use default bucket
default_bucket = cb['default']

# fetch a key with a function
print 'test = ' + str(default_bucket.get('test'))

ご覧のとおり、stacklesssocket を追加してから、Couchbase サーバーに接続しようとしています。症状は、以下のスタック トレースです。stacklesssocket が何をするのか正確にはわかりませんが、通常の python ソケットの機能を置き換える (または強化する) ことはわかっています。したがって、Couchbase がソケットを使用していて、期待どおりに動作していないようです。

Traceback (most recent call last):
  File "/Users/mark/Programming/MarkTestSite/server/src/dbteststackless.py", line 12, in <module>
    cb = couchbase.Server('localhost:8091', username='username', password='password')
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/couchbase/client.py", line 50, in __init__
    config = ServerHelper.parse_server_config(server_config_uri, username, password)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/couchbase/client.py", line 334, in parse_server_config
    response = urlopener.open(uri)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib.py", line 205, in open
    return getattr(self, name)(url)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib.py", line 344, in open_http
    h.endheaders()
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 904, in endheaders
    self._send_output()
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 776, in _send_output
    self.send(msg)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 735, in send
    self.connect()
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 716, in connect
    self.timeout)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 514, in create_connection
    raise error, msg
IOError: [Errno socket error] [Errno 61] Connection refused

Couchbase が通常どおり機能することを証明するために (常に適切なサニティ チェックが行われます)、機能するコードを次に示します。stacklesssocket をインポートするコードを単純に削除しました。

import couchbase

# connect to a couchbase server
cb = couchbase.Server('localhost:8091', username='username', password='password')

# use default bucket
default_bucket = cb['default']

# fetch a key with a function
print 'test = ' + str(default_bucket.get('test'))

これは期待どおりに機能し、次の出力が生成されました。

test = (0, 5, 'hello world')

スタックレス python 2.6.5 を使用しています。これを回避する方法はありますか? それとも、Couchbase モジュールは単純で、単純にスタックレスソケットと互換性がないのでしょうか? 私のプロジェクトは多数の同時接続を持つネットワーク サーバーであるため、スタックレス python とスタックレス ソケットを引き続き使用したいと考えています。人々の考えに感謝します。

4

0 に答える 0