2011-02-06 4 views
2

Я использую следующий код, чтобы связать ссылку с экземпляром couchDb, чтобы я мог проверить, что происходит с графическим интерфейсом, если база данных работает медленно.Что не так с этим кодом?

# 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-зависания. Когда я свяжусь напрямую, пропуская код выше, вставляет работу просто отлично!

Питон код, который разговаривает с базой данных CouchDB-питон (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 

Но один работает, а другой нет. Есть ли у кого-нибудь намек на то, как отлаживать это, или что может пойти не так?

+0

Чтобы ответить на мой собственный вопрос - я должен был импортировать сон из eventlet. Без этого зеленые потоки блокируются, и материал теряется. У меня также была аналогичная проблема в вызывающем, которая отправила следующее сообщение на кушетку до того, как была получена последняя, ​​и кто знает, кто получил ответ! – Ian

+0

Вы должны ответить на свой вопрос в разделе ответа не в комментарии. Таким образом, очевидно, что вы решили свою проблему и, возможно, застрелитесь на значке самообучения! – Rod

+0

Кроме того, вопрос не отображается в списке вопросов couchdb без ответа. Спасибо, однако, за возвращение сюда, чтобы добавить ответ, ради будущих читателей. – rossdavidh

ответ

1

Ян говорит:

Чтобы ответить на мой собственный вопрос - я должен импортируемые заспанные eventlet. Без этого зеленые потоки блокируются, и материал теряется. У меня также была аналогичная проблема в вызывающем, которая отправила следующее сообщение на кушетку до того, как была получена последняя, ​​и кто знает, кто получил ответ!