[英]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.