Python IRC bot在不中断主循环的情况下使循环休眠

Python IRC bot在不中断主循环的情况下使循环休眠,python,sockets,irc,feedparser,Python,Sockets,Irc,Feedparser,我一直在尝试编写一个IRC机器人程序,但我已经成功了。我在实现我想做的事情时遇到问题。代码工作正常,但我有以下问题: 由于当我添加第二个While和time.sleep(秒)时,bot使用While循环从IRC读取命令,因此bot不会连接,因为它读取了我的第二个循环并暂停了连接,而没有及时响应:PING do it disconnects。我一直在寻找,但是越是寻找,我就越是困惑,因为我不知道我应该尝试什么 无堆栈、多线程、子进程。结果太多了,让我更加困惑。那么,我尝试RSS机器人的最佳方法是什

我一直在尝试编写一个IRC机器人程序,但我已经成功了。我在实现我想做的事情时遇到问题。代码工作正常,但我有以下问题:

由于当我添加第二个While和time.sleep(秒)时,bot使用While循环从IRC读取命令,因此bot不会连接,因为它读取了我的第二个循环并暂停了连接,而没有及时响应:PING do it disconnects。我一直在寻找,但是越是寻找,我就越是困惑,因为我不知道我应该尝试什么

无堆栈、多线程、子进程。结果太多了,让我更加困惑。那么,我尝试RSS机器人的最佳方法是什么呢?如果我使用这个命令,这个机器人工作得很好!rss在IRC频道中,但我需要它每10分钟检查一次新的rss,如果使用sleep命令,主循环就会出错

这是我的密码:

#!/usr/bin/python

import socket, sys, string, time, feedparser, hashlib
port = 6667
nick = "RSSbot"
host = 'irc.server.com'
name =  "RSSBOT"
channel = '#debug'
ident = 'rssbot'
irc = socket.socket()
irc.connect ( (host, port) )
irc.send ( 'NICK ' + nick + '\r\n' )
irc.send ( 'USER ' + ident + ' ' +  ident + ' ' + ident + ' :rssbot\r\n' )

def readRss():
    feedurl = feedparser.parse("http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=username")
    newest = feedurl['items'][0].title
    newest = newest.replace("username:","")
    msg = newest.split("http://")
    title = msg[0]
    url = msg[1]
    url = "http://" + url
    e = feedurl.entries[2]
    threadurl = e.link
    id = hashlib.md5(url + title).hexdigest()
    irc.send ("PRIVMSG #debug :Tittle:%s\r\n" % newest)
    irc.send ("PRIVMSG #debug :URL: %s\r\n" % url)
    irc.send ("PRIVMSG #debug :MD5: %s\r\n" % id)
while 1:
    data = irc.recv ( 1024 )
    print(data)

    if data.find ( '376' ) != -1:
        irc.send( 'JOIN ' + channel + '\r\n' )
    if data.find ( 'PING' ) != -1:
        irc.send( 'PONG ' + data.split() [1] + '\r\n')
    if data.find ( '!rss' ) != -1:
        feedurl = feedparser.parse("http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=username")
        newest = feedurl['items'][0].title
        newest = newest.replace("username:","")
        msg = newest.split("http://")
        title = msg[0]
        url = msg[1]
        url = "http://" + url
        #e = feedurl.entries[2]
        #threadurl = e.link
        id = hashlib.md5(url + title).hexdigest()
        irc.send ("PRIVMSG #debug :Tittle:%s\r\n" % newest)
        irc.send ("PRIVMSG #debug :URL: %s\r\n" % url)
        irc.send ("PRIVMSG #debug :MD5: %s\r\n" % id)
    while true:
        readRss()
        time.sleep(300)

如果我在while 1:with a time.sleep(300)中添加一个while:true,sleep命令与while 1:loop冲突,我需要执行类似的操作,以便每x分钟检查一次新提要。我能做什么?

使用单独的计时器,而不是新的循环

import time
last_update = time.time()

while 1:
   # the rest of your while loop as usual
   now = time.time()
   if now - last_update > 300:
       # you've waited 300 seconds
       # check feeds or whatever 
       last_update = now

我用我的irc机器人上的线程模块处理了这个问题,检查这个项目,这可能会对你有所帮助(我称之为fonction ircloop,它将回答服务器ping并执行botting操作:)

我在这里没有看到第二个循环。我试过了,但没有成功。我试过用10秒钟来看看它是如何运行的,但似乎从来没有读过并执行过它。或者可能是我做错了,或者是我做错了。@slimentz试试看,如果不起作用,把你在问题中尝试的地方的完整代码贴出来,并在这里发表评论,这样我就可以看一看并向你展示这个问题。如果你做对了,这个方法肯定有效。是的,现在可以了。谢谢,很抱歉,我在这里发布了一篇新文章。我不知道如何正确地放置代码,虽然我尝试了10秒,但实际上需要36秒,但效果很好。@slimez如果
data=irc.recv(1024)
阻塞,那么它就不能在运行时发生,所以你真的设置了最小值,最大值是
recv
调用的时间加上超时。那么我该怎么办?增加积木?因为我需要机器人读取IRC上的命令,比如!用于手动检索数据的rss。同时在后台自动检查。