2016-04-02 17 views
2

Basit bir Twisted sorununu çözmeye çalışıyorum.Verileri Fabrika Görevleri Dışından, Görev Döngü Çağrısı ile tüm İstemcilere Gönderme İletisi

Kolaylık sağlamak için Python 2.7 Twisted Chat.py örneğini kullanıyorum.

from twisted.internet.protocol import Factory 
from twisted.protocols.basic import LineReceiver 
from twisted.internet import reactor 

class Chat(LineReceiver): 

    def __init__(self, users): 
     self.users = users 
     self.name = None 
     self.state = "GETNAME" 

    def connectionMade(self): 
     self.sendLine("What's your name?") 

    def connectionLost(self, reason): 
     if self.users.has_key(self.name): 
      del self.users[self.name] 

    def lineReceived(self, line): 
     if self.state == "GETNAME": 
      self.handle_GETNAME(line) 
     else: 
      self.handle_CHAT(line) 

    def handle_GETNAME(self, name): 
     if self.users.has_key(name): 
      self.sendLine("Name taken, please choose another.") 
      return 
     self.sendLine("Welcome, %s!" % (name,)) 
     self.name = name 
     self.users[name] = self 
     self.state = "CHAT" 

    def handle_CHAT(self, message): 
     message = "<%s> %s" % (self.name, message) 
     for name, protocol in self.users.iteritems(): 
      if protocol != self: 
       protocol.sendLine(message) 


class ChatFactory(Factory): 

    def __init__(self): 
     self.users = {} # maps user names to Chat instances 

    def buildProtocol(self, addr): 
     return Chat(self.users) 


reactor.listenTCP(8123, ChatFactory()) 
reactor.run() 

Ne yapmaya çalışıyorum her 60 saniyede bir çalışır ve bağlı tüm oturumlar veri gönderen Görev oluşturmak için twisted.internet görevi kullanmaktır.

yarı Sözdekod

def broadcastmsg(): 
    for client in factory: 
     client.protocol.transport.write("I am a Test\n\r") 

event = task.LoopingCall(broadcastmsg) 
event.start(60) 

sorunu Doğru davranmaya Twisted alamayan olduğunu. Her seansta başarabilirim. Fakat sonra her iki kullanım için de spam'i iki kat daha fazla bağlar.

cevap

0

Döngü çağrısı nasıl ayarlanıyor?

Bildiğiniz gibi protokoller fabrikalar tarafından oluşturulmakta ve yönetilmektedir. Tüm kullanıcılara belirli bir mesaj göndermek periyodik olarak fabrikaya yerleştirilmesi gereken bir göreve benziyor. LoopingCall'ı fabrikada __init__ yöntemiyle oluşturabilir ve init'ten hemen sonra başlatabilirsiniz. Tüm bağlantıların başına bir fabrika olduğu için bu, en azından benim için yapar, 60 saniye

class ChatFactory(Factory): 

    def __init__(self): 
     self.users = {} # maps user names to Chat instances 

     def broadcast_msg(): 
      for name in self.users: 
       self.users[name].sendLine("looping call send to users: {}".format(self.users.keys())) 

     self.looping_call = task.LoopingCall(broadcast_msg) 
     self.looping_call.start(60) 

bu Tamam çalışması gerekir başına sadece bir kez bildirim göndermelidir.

+0

Bunu yaptım ama broadcast_msg dosyasında "error" i yükseltirsem, izleme kodu "' 'd = self.looping_call.start (60); d.addErrback (twisted.python.log.err) '' 'Bu konuda yardımcı olabilir misiniz? – rolele

İlgili konular