Прочитал уже несколько десятков мануалов - так до меня и не дойдёт никак:
1) Когда в Tornado-корутинах следует использовать yield? В данный момент весь мой код работает без них (то есть, на сколько я понимаю, синхронно). В качестве примера, приведу этот класс:
class http_cb(tornado.web.RequestHandler):
bots = {}
def msg_to_event(self, cb): return (cb.get('id'), cb.get('date'), cb.get('user_id'), cb.get('user_id'), cb.get('body'), cb.get('attachments'))
def md5(self, s): return md5(str(s).encode('utf-8')).hexdigest()
@gen.coroutine
def post(self, *args, **kwargs):
bot_name, key = args
if bot_name not in self.bots.keys(): self.write('bot not in bots list')
else:
POST = tornado.escape.json_decode(self.request.body)
if self.md5('{}:{}'.format(bot_name, POST['group_id'])) != POST['secret']: self.write('invalid secret')
else:
if (POST['type'] == 'confirmation'): self.write(key)
else:
if (POST['type'] == 'message_new') and (POST['object']['out'] == 0): r = self.bots[bot_name].f(self.msg_to_event(POST['object']))
if (POST['type'] == 'group_join'): r = {'peer_id': POST['object']['user_id'], 'message': 'Привет!'}
if (POST['type'] == 'group_leave'): r = {'peer_id': POST['object']['user_id'], 'message': 'Пока!'}
try:
if type(r) == dict:
self.bots[bot_name].send(r)
self.write('ok')
except Exception as e: print(e)
2) Когда в обычном асинхронном программировании следует использовать async перед функцией и await внутри? Когда происходят действия определенного типа (какого?) ?