實踐,用tornado實現自定義協議server

2021-09-20 03:01:58 字數 2176 閱讀 3234

因為想讓**盡量少,所以委託模式沒有嚴格按照設計模式的規範寫,直接忽略掉了inte***ce的定義.嚴格來說是需要定義inte***ce和判斷傳入引數的型別的(泛華)

這是類的例項關係圖(也不知道是不是這樣畫...)

詳情見** myserverconnection._server_request_loop

@gen.coroutine

def _server_request_loop(self, delegate):

try:

#get request adepter

request_delegate = delegate.on_request(self)

while true:

try:

message_future = self.stream.read_until_regex(b"\n\r?")

message = yield message_future

message = self._parse_data(message)

except (iostream.streamclosederror,

iostream.unsatisfiablereaderror):

self.close()

return

except exception:

gen_log.error("uncaught exception", exc_info=true)

self.close()

return

ret = request_delegate.on_message(message)

#如果是非同步執行的方法,儲存future,用於確保close時,所有future都已完成

if isinstance(ret, future):

ret.add_done_callback(lambda f:self._serving_futures.remove(f))

finally:

delegate.on_close(self)

def close(self):

def mayby_close(f):

futures = self._serving_futures+self._pending_writes

if not any(futures):

self.stream.close()

pending_futrues = self._serving_futures+self._pending_writes

if any(pending_futrues):

map(lambda f:f.add_done_callback(mayby_close),pending_futrues)

else:

self.stream.close()

其實用@coroutine的時候只需要記住幾點就行了

* 1.被包裝的函式(方法),返回值是future,

* 2.被包裝的函式走完最後一行**後,返回的futurecallback就會被執行(因為在runner中引發了stopiteration錯誤,被set_result了)

* 3.被包裝的函式是在gen.runner中執行的,而runner是在ioloop(callback那塊)中執行的

**非常簡單,因為tornado為我們提供了非同步的庫(tornado真強大,協程好厲害!!),並且是單程序的程式設計,不需要考慮鎖,寫起來就更輕鬆了.

最後附上程式效果圖

這只是個吃飽撐著的程式,一點實際作用都沒啊(好想被拍死!).吃飽撐著的原因是我還沒下決心去找工作...工作太難找啦(哭~~)!!!!好想被帶走.................

用棧實現自定義算術運算

用棧實現自定義算術運算 對應運算 且有規則 2 3 4 2 3 4 實現要點 1 定義數字棧和符號棧 2 壓棧操作是棧頂指標先加1,再賦值,出棧操作時先賦值,棧頂指標再減1 3 用switch語句實現算術運算和優先規則定義要簡單些 4 主函式中,對每個數字進行數字棧入棧操作,根據運算子的優先順序,對...

自定義Toast實現自定義Toast布局

平時我們使用toast的時候都是這樣的一種方法 toast toast toast.maketext context,duration 現在我們來自定義下toast的布局,首先看下toast建立時的源 public static toast maketext context context,char...

用WP Query自定義WordPress 主迴圈

我們知道操作 wordpress 主迴圈 wordpress loop 最容易的方法是使用 query posts 函式。但是使用 query posts 直接修改 wordpress 預設的主迴圈,會有以下的問題 會干擾那些用到了 wordpress 迴圈的外掛程式。可能使一些 wordpress...