2014-02-17 4 views
1

Я создаю лог-журнал IRC, который сохраняет данные в журнале по дате. Я хочу, чтобы программа закрыла настоящий реактор и сделала новый (это потому, что он сохранит журналы в новом файле). Я написал пример программы, но она не в состоянии работы-Способ создания нового витого реактора?

def event(): 
    if no date_change: 
     do normal work that has to be done 
    else: 
     stop present reactor 
     make a new reactor 

Вот фактический код, который я использую: -

def irc_NICK(self, prefix, params): 
     """Called when an IRC user changes their nickname.""" 
     old_nick = prefix.split('!')[0] 
     new_nick = params[0] 
     if self.factory.filename.find(file_name_gen())!=-1: 
       self.logger.log("<em>%s is now known as %s</em>" % (old_nick, new_nick),1) 
     else: 
       print "new itng" 
       reactor.stop() 
       irc.IRCClient.connectionLost(self, "Day Change") 
       #earlier the LogBotFactory object is f 
       f1 = LogBotFactory("meeting-test", file_name_gen()) 
       reactor.connectTCP("irc.freenode.net", 6667, f1) 
       reactor.run() 

Второй объект LogBotFactory получает создан, но, программа останавливается из-за некоторая необработанная ошибка. Это отслеживающий, что я получаю ...

1971-01-02 23:59:41+0530 [-] Log opened. 
1971-01-02 23:59:41+0530 [-] Starting factory <__main__.LogBotFactory instance at 0x27318c0> 
1971-01-03 00:00:10+0530 [LogBot,client] new itng 
1971-01-03 00:00:10+0530 [LogBot,client] Starting factory <__main__.LogBotFactory instance at 0x2989cb0> 
1971-01-03 00:00:10+0530 [LogBot,client] Unhandled Error 
    Traceback (most recent call last): 
     File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 221, in _dataReceived 
     rval = self.protocol.dataReceived(data) 
     File "/usr/lib/python2.7/dist-packages/twisted/words/protocols/irc.py", line 2412, in dataReceived 
     basic.LineReceiver.dataReceived(self, data.replace('\r', '')) 
     File "/usr/lib/python2.7/dist-packages/twisted/protocols/basic.py", line 581, in dataReceived 
     why = self.lineReceived(line) 
     File "/usr/lib/python2.7/dist-packages/twisted/words/protocols/irc.py", line 2420, in lineReceived 
     self.handleCommand(command, prefix, params) 
    --- <exception caught here> --- 
     File "/usr/lib/python2.7/dist-packages/twisted/words/protocols/irc.py", line 2464, in handleCommand 
     method(prefix, params) 
     File "irc.py", line 141, in irc_NICK 
     reactor.run() 
     File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 1191, in run 
     self.startRunning(installSignalHandlers=installSignalHandlers) 
     File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 1171, in startRunning 
     ReactorBase.startRunning(self) 
     File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 681, in startRunning 
     raise error.ReactorAlreadyRunning() 
    twisted.internet.error.ReactorAlreadyRunning: 

1971-01-03 00:00:10+0530 [-] Main loop terminated. 

Я новичок в Python скручены. Пожалуйста, помогите, спасибо.

ответ

2
print "new itng" 
reactor.stop() 
irc.IRCClient.connectionLost(self, "Day Change") 
#earlier the LogBotFactory object is f 
f1 = LogBotFactory("meeting-test", file_name_gen()) 
reactor.connectTCP("irc.freenode.net", 6667, f1) 
reactor.run() 

Эта проблема еще проще решить, чем вы думаете. Удалите строки reactor.stop() и reactor.run(), и все будет готово. Другими словами, просто покиньте реактор.

Отдельно, вам также необходимо заменить линию irc.IRCClient.connectionLost(self, "Day Change") на self.loseConnection(). Вызов connectionLost не закрывает соединение. Он получает, когда Twisted видит, что соединение было закрыто. Если вы его назовете сами, ваша программа может подумать, что соединение было закрыто, но это не будет действительно были закрыты - и после этого достаточно времени, когда у вас будет нехватка ресурсов, и ваша программа больше не будет работать.

Вы должны только остановить реактор, когда закончите, используя Twisted (обычно перед выходом вашей программы).

+0

+1 для «Удалите линии: реактор.стоп() и реактор.run(), и все будет установлено" – jfs

Смежные вопросы