我正在用Python创建一个以Twitch为中心的IRC机器人,但是它的响应很慢。我究竟做错了什么?

时间:2016-05-08 18:26:30

标签: python sockets irc twitch

正如标题所说,虽然这也是我第一次使用Python真正做大事。我还不熟悉这种语言,所以这可能是我遗漏的东西。代码相当短,如下所示,删除了用户名和私有密码:

app.UseFileServer()

有一点需要提及的是,我遵循的是基本的模板风格,但它没有涵盖在机器人中实施耳语 - 所以我不得不通过研究如何做到这一点来猜测,而且似乎是最推荐的方式是两个连接,一个用于公共,一个用于私人。

1 个答案:

答案 0 :(得分:1)

在构建代码时,除了从private套接字获取内容之外,您无法从public套接字获取任何内容。如果IRC偶尔不发送PING个消息,那么情况会更糟。

处理此问题的方法是使用select,并为其提供两个套接字。只要有一个可以读取的内容,select将返回,并指示哪个套接字有可用于读取的字节。

This answer有一些通用代码。您可能希望将其修改为:

while True:
    # this will block until at least one socket is ready
    ready_socks,_,_ = select.select([private, public], [], [])
    if private in ready_socks:
        privateResponse += private.recv()
    if public in ready_socks:
        channelResponse += public.recv()

    # check privateResponse buffer, do stuff
    # check channelResponse buffer, do stuff

还应该记住一些其他事项:

  1. 网络不必同时提供整个IRC消息,也不必一次提供一个IRC消息。您可以将“PI”,“NG:t”,“mi.twitch.tv”,“\ r \ n”作为单独的消息。所以你应该在缓冲区中累积字节,然后当你至少得到一条完整的消息时,处理它,然后将它从缓冲区中删除。
  2. UTF-8字符可以跨越多个字节,并且可能被网络分割。在您确定要使用完整的消息之前,请不要解码UTF-8。