2

以下のコードを使用して、couchDb インスタンスへのリンクをスラグします。これにより、データベースが遅い場合に GUI がどうなるかをテストできます。

# coding=utf8   slowCoach.py - a server that delays every message 
#      thus making the database crawl. 
import eventlet
from time import sleep
def closed_callback():
    print "called back"
def forward(source, dest, cb = lambda: None):
    """Forwards bytes unidirectionally from source to dest"""
    while True:
        d = source.recv(32384)
        if d == '':
            cb()
            break
        sleep(0.3)    
        dest.sendall(d)
listener = eventlet.listen(('localhost', 5981 ))
while True:
    client, addr = listener.accept()
    server = eventlet.connect(('192.168.0.1',5984))
    # two unidirectional forwarders make a bidirectional one
    eventlet.spawn_n(forward, client, server, closed_callback)
    eventlet.spawn_n(forward, server, client)

このコードは、ポート フォワーダーの例に基づいています。

ドキュメントを読み取り、削除、更新するときは期待どおりに動作しますが、挿入すると GUI がハングします。上記のコードを見逃して直接リンクすると、挿入は問題なく機能します!

データベースと通信している Python コードは、couchDB-python (http://code.google.com/p/couchdb-python/) であり、保存と挿入の両方で次のステートメントを実行します。

    try: 
        self.db.save(dic)
    except couchdb.ResourceConflict: # wrong _rev - updated by someone else
        return False
    for fld in ['_id','_rev']:  # set id and rev to current values 
        value = dic[fld]
        setattr(self, fld, value)
    self._status = CouchObject.CLEAN
    return self

しかし、一方は機能し、もう一方は機能しません。これをデバッグする方法、または何が問題なのかについてのヒントはありますか?

4

1 に答える 1

1

イアン 言います:

私自身の質問に答えるには、イベントレットからスリープをインポートする必要がありました。そうしないと、緑のスレッドがロックされ、内容が失われます。発信者にも同様の問題があり、最後に受信する前に次のメッセージをソファに送信し、誰がどの返信を受け取ったかは誰にもわかりません!

于 2011-02-09T06:51:32.483 に答える