2010-09-16 73 views
2

我想使用Twisted重建现有应用程序的通信部分。此应用程序确实将数据从客户端发送到服务器,只有这样,服务器才会发送任何内容。从Twisted客户端发送到Twisted服务器,只有这一种方式

我该如何使用Twisted的事件驱动概念来实现?我目前使用connectionMade方法Protocol,但我不认为这是正确的方法。

class Send(Protocol): 

    def connectionMade(self): 
     while True: 
      data = queue.get() 
      self.transport.write(data + "\n") 
      self.transport.doWrite() 

我敢肯定,这是做到这一点的方式。 ;-)

加法: 我的问题是,我不能想象什么事件用于此。我认为connectionMade事件并不是正确的,但我决不会在connectionLost以外的任何其他事件,因为服务器不会向客户端发送任何内容。我应该改变这种行为吗?

回答

2

不,这绝对不是这样做的正确方法。永远不要打电话给doWrite

这里的问题是,我打赌queue.get()只是阻止,直到有一些数据。如果可能的话,使用消息传递的非阻塞方式而不是线程。例如,让你的线程callFromThreadSend协议来做一些事情。

但是,假设一个阻塞 '得到' 打电话,这样的事情可能工作:

from twisted.internet.protocol import Protocol 
from twisted.internet.threads import deferToThread 

class Send(Protocol): 
    def connectionMade(self): 
     self.qget() 

    def qget(self, data=None): 
     if data is not None: 
      self.transport.write(data) 
     deferToThread(queue.get).addCallback(self.qget) 
+2

http://stackoverflow.com/questions/1538617/http-download-very-big-file/1657324# 1657324谈论在扭曲代码循环的危险,并且还涵盖生产者/消费者,这也可能有助于提问者。 – 2010-09-16 21:51:38

+0

是的,在Twisted事件中不使用循环也不阻止调用听起来很合理,这会使事件驱动的框架变得毫无意义。 – 2010-09-17 05:13:27

+0

为什么你不应该叫'doWrite'? – Claudiu 2013-04-26 22:26:03

相关问题