我对asyncio
非常陌生,并且想知道哪种API在更好的做法,协议或流方面比另一种更好?
对我来说,protocol(callback based API)
似乎更容易使用,因为已经为您提供了connection_made
和data_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
答案 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
。