从Twisted客户端发送到Twisted服务器,仅此一种方式。

3
我想使用Twisted重新构建现有应用程序的通信部分。该应用程序只从客户端向服务器发送数据,服务器不发送任何内容。
如何使用Twisted的事件驱动概念实现这一点?我目前使用Protocol的connectionMade方法,但我认为这不是正确的方法。
class Send(Protocol):

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

我非常确定这不是做这件事的方法。;-)
补充: 我的问题是,我无法想象要使用哪个事件。我认为connectionMade事件不是正确的事件,但在我的情况下,我永远不会到达除connectionLost事件之外的任何其他事件,因为服务器不向客户端发送任何内容。我应该改变这种行为吗?
2个回答

2
不,那绝对不是正确的方法。永远不要调用doWrite。
问题在于我打赌queue.get()只会阻塞直到有一些数据。如果可能的话,使用非阻塞的消息传递方式而不是线程。例如,让你的线程只调用Send协议中的callFromThread来执行某些操作。
但是,假设有一个阻塞的“get”调用,像这样的东西可能有效:
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
https://dev59.com/vnI_5IYBdhLWcg3wEexu#1657324讨论了Twisted代码中循环的危险性,并且还涵盖了生产者/消费者,这对提问者也可能有所帮助。 - Jean-Paul Calderone
是的,不在Twisted事件中使用循环或阻塞调用听起来是合理的,否则这将使得基于事件驱动的框架毫无意义。 - Manuel Faux
为什么你永远不应该调用 doWrite 函数? - Claudiu
doWrite是从反应器调用的方法,当需要写一些数据时。这意味着底层文件描述符已准备好进行写入操作。 - Glyph

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接