簡體   English   中英

從現有阻塞代碼重構扭曲的tcp客戶端

[英]Refactoring for a twisted tcp client from existing blocking code

我有一個python程序,目前使用我編寫的tcp / ip客戶端模塊從流服務器接收數據。 服務器輸出數據行。

我的TCP客戶端類是相當原始的,我想重構使用扭曲的ReconnectingClientFactory。

主程序當前從我的TCP客戶端中的readLines函數獲取數據,該函數在收到行時“生成”這些行。

通過以下方式訪問TCP客戶端方法:

for msg_buffer in self.myTcpClient.readLines():
    do some stuff with the data in msg_buffer

在我的TCP客戶端中,readLines方法本質上看起來像:

while True:
    newLine = self.sock.recv(self.buffer_size)
    yield newLine

當我實現扭曲的客戶端時,我想要一些方式使它表現為迭代器和產生數據。 我假設我在協議dataReceived方法中做了一些事情。

我迷失了,想弄清楚它是如何工作的。 在我看來,扭曲延遲是為了這種用途,但我無法弄清楚如何使用延遲為我的目的(如果我的延期假設是正確的)。

在一個完美的世界中,扭曲的客戶端會產生收到的線路,因此類似於本方法的調用將完成這項工作。

class GetData(protocol):
    def dataReceived(self, data):
        yield data

但我認為這過於簡單化了。

總之,我要做的是實現一個扭曲的重新連接TCP客戶端,其行為類似於我的readLines方法,可以訪問或多或少像:

for msg_buffer in self.twistedTcpClient.readLines():

任何指針都將非常感激

更新:我偶然發現'Crochet'因為扭曲了。 乍一看,Crochet似乎是為我所需要的那種型號設計的...我會在經過一些測試后報告回來

扭曲的方式是編寫一個協議。 而不是做:

for line in self.twistedTcpClient.readLines():
    process_line(line) ...

您可以編寫協議(可能通過子類化twisted.protocols.basic.LineReceiver ):

class MyProtocol(LineReceiver):
    ...
    def lineReceived(self, line):
        process_line(line) ...

您希望重構代碼以使用lineReceived回調而不是迭代循環。

你寫的:

for line in self.twistedTcpClient.readLines():
    process_line(line) ...

是有問題的,因為Twisted是異步的。 在等待twistedTcpClient.readLines()方法時,Twisted無法繞過其他任何操作。

我建議編寫一個協議,但如果你真的堅持使用這個迭代器模式,那么你可以這樣做:

@inlineCallbacks
def my_func():
    while True:
        try:
            line = yield self.twistedTcpClient.getNextLine()
        except StopIteration:
            break

        process_line(line) ...

現在,棘手的是讓twistedTcpClient為每次調用getNextLine()返回Deferreds 也許是這樣的:

class MyProtocol(LineReceiver):
    ...
    def getNextLine(self):
        self.defer_given_out = Deferred()

    def lineReceived(self, line):
        self.defer_given_out.callback(line)

    def connectionLost(self):
        self.defer_given_out.errback(StopIteration())

(這只是一個說明這個想法的例子,你必須擴展它以處理細節。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM