我应该在asyncio中使用协议还是流?

时间:2016-07-05 21:52:58

标签: python python-3.x coroutine python-asyncio

我对asyncio非常陌生,并且想知道哪种API在更好的做法,协议或流方面比另一种更好?

对我来说,protocol(callback based API)似乎更容易使用,因为已经为您提供了connection_madedata_received方法。使用streams(coroutine based API),您必须自己管理连接和读取数据,但我觉得它更多地使用coroutine的概念,这对我来说似乎是件好事。

这就是我收听传入数据的方式,对我来说感觉很尴尬。我也可以使用readeexactly,但有时它会引发IncompleteReadError

message_body = b''
message_length = SOME_NUMBER
while True:
    while len(message_body) < message_length:
        try:
            message_body_chunk = await reader.read(message_length - len(message_body))
        except Exception as e:
            self.logger.error(e)
            return
            if not message_body_chunk:
                return
            message_body += message_body_chunk

1 个答案:

答案 0 :(得分:4)

stream objects是更高级别,并提供了许多有用的方法:

与任何抽象一样,这需要付出代价:协程的反应性要比回调少一些。例如,function tweetEvent(eventMsg) { var replyto = eventMsg.in_reply_to_screen_name; var text = eventMsg.text; var from = eventMsg.user.screen_name; // the status update or tweet ID in which we will reply var nameID = eventMsg.id_str; console.log(replyto + ' ' + from); if( (text.indexOf('myhandle') >= 0) || (from != 'myhandle')) { var reply = replies[Math.floor(Math.random() * replies.length)]; var newtweet = '@' + from + ' ' + reply; tweetIt(newtweet); } function tweetIt(txt) { var tweet = { status: txt, in_reply_to_status_id: nameID } } T.post('statuses/update', tweet, tweeted); function tweeted(err, data, response) { if (err) { console.log("Something went wrong!"); } else { console.log("It worked!"); } } } 涉及至少两个事件循环回调:

  • 当收到某些数据时,会触发回调并调用urlpatterns = patterns('', url(r'^polls/', include('polls.urls', namespace="polls")), )
  • 然后reader.read()触发另一个恢复reader.feed_data
  • 执行的回调