2013-12-23 4 views
2

Я хочу переопределить мой класс WebSocketClientFactory, чтобы позволить очереди заданий заполняться входящими данными. Вот код подключения Я пытаюсьПереопределить Autobahn/Twisted WebsocketClientProtocol класс

factory = WebSocketClientFactory("ws://localhost:7096") 
    job_queue = Queue.Queue() 
    factory.protocol = BridgeSocket(job_queue) 
    connectWS(factory) 

А вот мой сокет класс:

class BridgeSocket(WebSocketClientProtocol): 
    def __init__(self,producer_queue): 
     self.producer_queue = producer_queue 

    def sendHello(self): 
     self.sendMessage("hello") 

    def onOpen(self): 
     self.sendHello() 
..... 

Однако я получаю ошибку

exceptions.AttributeError: BridgeSocket instance has no __call__ method 

Есть ли способ я могу разделить очереди между моим главным потоки и веб-ящики, которые я создаю внутри них.

ответ

3

Одним из вариантов является сделать

factory = WebSocketClientFactory("ws://localhost:7096") 
factory.job_queue = Queue.Queue() 
factory.protocol = BridgeSocket 

, а затем получить доступ к общей очереди из вашего протокола, как этот

class BridgeSocket(WebSocketClientProtocol): 

    def onMessage(self, payload, isBinary): 
     self.factory.job_queue.put(payload) 

* Sidenote: Вы используете AutobahnPython ствол из GitHub? Вы должны использовать тегированную версию или последнюю версию PyPI (0.6.5). *

+0

Спасибо. Я помню, используя версию по умолчанию от pip install. Я делаю что-то неправильно? – crazydiv

+0

Версия по умолчанию от Pip в порядке. Просто не используйте trunk - это может быть при рефакторинге и не работает (и мне было интересно узнать о конкретной ошибке, которую вы получили ... '__call__' не реализована). – oberstet

1

В случае, если кому-то это нужно, я также пробовал этот подход, который работает, но решение oberstet выглядит очень элегантно и эффективно.

class BridgeSocket(WebSocketClientProtocol): 

    def __init__(self,factory,job_queue): 
     self.job_queue = job_queue 
     self.factory=factory 

class BridgeSocketClientFactory(WebSocketClientFactory): 

    def __init__(self,url,job_queue): 
     WebSocketClientFactory.__init__(self,url) 
     self.job_queue = job_queue 

    def buildProtocol(self, addr): 
     return BridgeSocket(self,self.job_queue) 


factory = BridgeSocketClientFactory("ws://localhost:7096",job_queue) 
connectWS(factory) 
+0

Да, это тоже работает .. и это более общий подход. В приведенном выше ответе я попытался дать кратчайшее возможное решение. – oberstet

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