2011-11-09 88 views
3

我正在構建一個使用Twisted的應用程序,其中服務器包含一些定時器,並且每秒多次通過UDP將定時器值寫入客戶端。客戶端需要能夠向服務器發送各種命令(如「暫停計時器1」或「重置計時器2」)以更改發送到客戶端的計時器。我看到的問題是,客戶端不斷記錄從服務器接收到的定時器值,所以我不知道如何在沒有阻塞的情況下做到這一點。我想要異步執行此操作,而無需使用任何線程。 Twisted提供了大量的異步IO選項,但我真的不確定哪個最合適,因爲其中的一些(如basic.LineReceiver協議)在等待用戶輸入時仍然阻塞。同時使用Twisted記錄並執行命令行輸入

由於提前, 本

附:這是我的第一篇文章,請讓我知道我可以做的任何改進。

回答

1

對於非阻塞標準I/O,可以使用twisted.internet.stdio。這提供了一種備用流,有序,面向連接的傳輸方式,可以與通常在這種傳輸方式上運行的任何協議(其他類似傳輸包括TCP和SSL)一起使用。

參見stdin.py和stdiodemo.py從http://twistedmatrix.com/documents/current/core/examples/

另外,LineReceiver不是「阻塞在等待用戶輸入的」連接的。這只是一個協議,它甚至不做任何I/O本身。

+0

非常感謝Jean-Paul。我早先看了一下twisted.internet.stdio,但看起來並不像我期待的那樣。看起來我仍然有一些關於Twisted的學習方法! –

+0

看起來給出的示例在Windows上不起作用,由於某些原因,Win32Api不斷將stdin的值設置爲3,將stdout的值設置爲7(而不是扭曲的預期0和1)。我將使用'raw_input'和'threads.deferToThread()'來實現一個不同的方法。也許開始在Linux上開發... –