Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用twisted的循环函数调用_Python_Twisted - Fatal编程技术网

Python 使用twisted的循环函数调用

Python 使用twisted的循环函数调用,python,twisted,Python,Twisted,我有一个基本的IRC机器人,看起来像这样(见下文),我想做的是使用类似于\u 5_mins的函数,每5分钟通过循环调用调用一次 import sys import re from twisted.internet import reactor, task, defer, protocol from twisted.python import log from twisted.words.protocols import irc from twisted.application import in

我有一个基本的IRC机器人,看起来像这样(见下文),我想做的是使用类似于
\u 5_mins
的函数,每5分钟通过
循环调用调用一次

import sys
import re
from twisted.internet import reactor, task, defer, protocol
from twisted.python import log
from twisted.words.protocols import irc
from twisted.application import internet, service
import time

HOST, PORT = 'irc.freenode.net', 6667

class IrcProtocol(irc.IRCClient):
    nickname = 'BOTSNAME'
    password = 'NICKPASSWORD'
    timeout = 600.0

    def signedOn(self):
        pMess = "IDENTIFY %s" % self.password
        self.msg("NickServ",pMess)
        time.sleep(10)
        for channel in self.factory.channels:
            self.join(channel)

    def _5_mins(self):
        self.msg(self.factory.channels[0],"5 minutes have elapsed")

class IrcFactory(protocol.ReconnectingClientFactory):
    channels = ['#BOTCHANNEL']
    protocol = IrcProtocol

if __name__ == '__main__':
    reactor.connectTCP(HOST, PORT, IrcFactory())
    log.startLogging(sys.stdout)
    reactor.run()

elif __name__ == '__builtin__':
    application = service.Application('IrcBot')
    ircService = internet.TCPClient(HOST, PORT, IrcFactory())
    ircService.setServiceParent(application)
如何更改
signedOn
函数与
task.LoopingCall
函数一起工作,还是有更好的方法

编辑:我真的很接近一个解决方案,以下是我所做的

def signedOn(self):
    pMess = "IDENTIFY %s" % self.password
    self.msg("NickServ",pMess)
    time.sleep(10)
    for channel in self.factory.channels:
        self.join(channel)
    lc = task.LoopingCall(self._5_mins)
    lc.start(self.timeout)
def签名(自):
pMess=“标识%s”%self.password
self.msg(“NickServ”,pMess)
时间。睡眠(10)
对于self.factory.channels中的通道:
加入(频道)
lc=任务循环调用(自我5分钟)
lc.启动(自超时)

听起来你已经完成了99.9%的任务。是什么阻止你将
循环调用
\u 5分钟
一起使用?@Jean-Paul Calderone是的,我刚刚找到了答案,我将编辑我的帖子。:)一旦SO超时过期,您应该将其作为问题的答案发布。此外,您真的不应该在Twisted中使用代码调用
time.sleep
。如果您需要延迟,有
reactor.callLater
。但是我认为你不需要在这段代码中延迟,
time.sleep
就在那里,这样nickserver就有时间在你尝试加入频道之前进行身份验证,以防它们是为注册用户提供的。在NickServ设置正确的模式之前,我尝试加入频道时遇到了一些问题。但正如您所说,我应该能够稍微将代码重新编写成
callLater
来删除它,并且仍然可以避免这个问题。谢谢