【问题标题】:Ending infinite loop for a bot结束机器人的无限循环
【发布时间】:2016-09-25 00:24:44
【问题描述】:

我为 Twitch IRC 创建了一个聊天机器人,我可以连接和创建命令等,但是我不能在命令提示符下使用键盘中断。我怀疑是因为它陷入了这个无限循环,我不知道如何解决这个问题?顺便说一句,我是编程新手!

这是我在Run.py 中的代码,openSocket() 在另一个文件中定义,基本上是连接到服务器。 s = socket.socket. while-loop 的第一部分基本上只是读取服务器消息,我认为这对你们来说非常简单!

s = openSocket()
joinRoom(s)
readbuffer = ""

while True:
        readbuffer = readbuffer + s.recv(1024).decode("utf-8")
        temp = str.split(readbuffer, "\n")
        readbuffer = temp.pop()

        for line in temp:
            if "PING" in line:
                s.send("PONG :tmi.twitch.tv\r\n".encode("utf-8"))
                print("---SENT PONG---")
            printMessage(getUser, getMessage, line)
            message = getMessage(line)

            for key in commands:
                command = key
                if command in message:
                    sendMessage(s, commands[command])

((编辑:我也有这个问题,无论出于何种原因,与服务器的连接似乎超时。我设法让它与 ping/pong 保持连接约 40-45 分钟,但随后又断开了。

编辑:

抱歉,原来的帖子太乱了。我用最少的代码创建了这个pastebin,我可以用它来重新创建问题。 如果 IRC 聊天处于非活动状态,它将断开连接,并且我无法让它连续发送 2 个 ping 而中间没有任何消息,不确定这是因为它在第 2 次 ping 之前断开还是因为第 2 次 ping。

至少有一次它在我从服务器收到第一个 ping 之前就断开了。

粘贴箱:pastebin.com/sXUW50sS

【问题讨论】:

  • 您是否使用多线程,也许隐含在joinRoom 中?只有主线程可以被信号杀死。
  • pastebin.com/b3h2Y9BE在这里可以看到我用来连接服务器的所有功能!
  • 这不是特别有用。请尝试创建一个minimal example。您确定您的循环实际上正在推进吗?如果您的套接字没有足够的数据,则要求它提供固定大小 (s.recv(1024)) 将阻塞。这是一个阻塞系统调用,你不能从python内部中止。它还可以解释您的超时。
  • 我实际上不太确定任何事情,如果它正在推进或如何解决这个潜在的问题 (s.recv(1024))。我是个新手,机器人的整个部分只是我想通过的东西,所以我可以练习更简单的东西。我可以尝试给你一个更有用的链接,但我很不确定要在其中包含什么。我想我可以尝试制作一个包括与连接相关的所有部分..
  • pastebin.com/sXUW50sS 抱歉回复晚了,这是我可以重现问题的最少代码量。即使它正在发送 PONG,机器人也会保持断开连接,尽管只有在聊天不活动时才会发生这种情况,如果人们正在积极聊天,这似乎很好。我也无法在命令提示符下轻松退出机器人,必须将其全部关闭,因为它卡在循环中。

标签: python loops infinite


【解决方案1】:

您发布的部分代码与您描述的问题没有太大关系。

这是一个猜测(尽管是受过教育的)。在您的套接字连接中,您可能正在使用try: except: 并使用Pokemon 方法(必须全部抓住)

这里的事情是找到你正在做这样的事情的一行:

except:
    pass

并将其更改为:

except (KeyboardInterrupt, SystemExit):
    raise
except:
    pass

显然,我并不是要在这里说您的 porgram 应该捕获所有异常并像什么都没发生一样通过。要点是您可能已经这样做了(出于我不知道为什么的原因),您应该对系统错误进行特殊处理。

【讨论】:

  • KeyboardInterrupt 不会扩展 Exception 所以except Exception: pass 应该仍然捕获所有内容,但让 Ctrl-C 上升。
  • pastebin.com/b3h2Y9BE 在这里你可以看到我的整个初始化文件,其中定义了 openSocket() 函数。正如我所说,我有点新,我在 youtube 上关注了一些人做这部分,因为它比我的水平高很多。
猜你喜欢
  • 2013-09-30
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 2017-06-11
  • 2020-04-21
  • 1970-01-01
相关资源
最近更新 更多