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 とスタックレス ソケットを引き続き使用したいと考えています。人々の考えに感謝します。