0
0 комментариев

Всем привет! У меня есть примерно такой код, который нуждается в блокировке:

self.search_params['my_sex'] = ''
self.search_params['wish_sex'] = 'F'
with (yield self.application.search_lock.acquire()):
   for uid in self.application.inSearch:
      if isComplyUsers(self.search_params, self.application.pool[uid]):
         self.connected(self.uid, uid)
         self.application.inSearch.pop(uid)
         return True
 
self.application.inSearch.append(self.uid)

Сама функция isComplyUsers:

  def isComplyUsers(user, user1):
    if(user['my_sex']!='' and user['wish_sex']!='' and user['wish_sex']!=user1['my_sex']):
        return False
     return True

self.application.search_lock — tornado.locks.Lock()

Я конечно сократил код, отделив только главные момент из-за чего происходит ошибка.
Иногда в логе выскакиевает ошибка:

__del__ future <tornado.object.concurrent.Future object exception

И жалуется он на KeyError, и говорит, что ‘my_sex’ не существует в объекте user. Так вот спрашивается, зачем он вообще вызывает эту функцию в своём деструкторе «__del__». И если я просто буду проверять на пустоту объекта — будет ли это решением проблемы? Также, заметил, что ошибка появляется, только если search_params[‘my_sex’] = » именно равен пустоте, если он чему-то не пустому равен, то ошибки не возникает.


Добавить комментарий