摘要:點的話會提交一個請求給服務器,服務器返回一個新頁面,其上面顯示一個。對象的值是以協(xié)程的方式保存在服務器端的。類似的想法最出名的框架是的。于是乎就有這些詭異的實現(xiàn)了。
在史前的web開發(fā)時代(我說的是AngularJS工程師開始變得價值不菲之前的黑暗歲月),web開發(fā)的一個痛點在于HTTP是一個無狀態(tài)的協(xié)議,瀏覽器是一個無狀態(tài)的展示表單提交工具。當然現(xiàn)在的web開發(fā)世界已經不再是如此了,瀏覽器已經儼然是一個全功能的客戶端了,B/S和C/S架構的差異已經接近彌合。在那個年代,有一些人就想,讓狀態(tài)從服務器傳到瀏覽器,然后再在瀏覽器提交表單的時候傳回來這多麻煩呀。如果能夠讓服務器保存表單狀態(tài),代碼寫起來該多么酷啊,比如下面這個例子(Stackless Python Nagare):
class Counter(object): def __init__(self): self.val = 0 def increase(self): self.val += 1 def decrease(self): self.val -= 1 @presentation.render_for(Counter) def render(counter, h, *args): h << h.div("Value: ", counter.val) h << h.a("++").action(counter.increase) h << "|" h << h.a("--").action(counter.decrease) return h.root
這段代碼實現(xiàn)的功能是在瀏覽器上顯示一個“0”,然后有++和--兩個鏈接。點++的話會提交一個HTTP請求給服務器,服務器返回一個新頁面,其上面顯示一個“1”。
背后的思想是把頁面上的內容建模為一個狀態(tài),在代碼中這個狀態(tài)就是那個counter對象。counter對象的值是以協(xié)程的方式保存在服務器端的。不僅僅是counter的值,以及h.a("++").action(counter.increase)這樣綁定的事件與回調函數的映射也被保存了下來了。客戶端的操作通過HTTP發(fā)到服務器之后。服務器根據渲染頁面時注入的一些id表示符,找到對應的協(xié)程,然后加載協(xié)程,再把協(xié)程往后執(zhí)行一步,同時渲染出一個新的HTML頁面,返回給客戶端。類似的想法最出名的框架是smalltalk的seaside。
假設我們是服務器,當我們把頁面發(fā)給客戶端之后,等待客戶端的返回,然后根據返回執(zhí)行后面的事情。類似這樣
page1 = initial_render() send_to_browser(page1) resp = wait_for_browser_response() page2 = do_something(resp) send_to_browser(page2)
中間wait_for_browser_response()就是一個大大的流程阻塞,當然為什么不能用協(xié)程去對這個流程阻塞問題進行建模呢。于是乎就有這些詭異的實現(xiàn)了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45299.html
摘要:一般的做法是把這些動作寫在和的兩個方法里,單元測試框架會負責在開始和結束的時候調用這兩個方法。從視覺上無法直觀的指導原來和是一對的。然后再把這個小的上下文附著到主測試邏輯上這里利用了單元測試的的特性,把轉化為回調在的時候就設置好。 很多測試都需要在啟動的時候做一些事情,然后在結束的時候再把做的事情給清理了。一般的做法是把這些動作寫在setUp和tearDown的兩個方法里,單元測試框架...
摘要:常規(guī)版本的的是不可以被持久化保存的。在流程被阻塞的時候比如需要審批老板不在把協(xié)程持久化成入庫,等流程不再阻塞的時候把協(xié)程重新從數據庫里拉起來繼續(xù)執(zhí)行。 常規(guī)版本的Python的generator是不可以被持久化保存的。但是stackless和pypy這兩個修改版本的Python解釋器可以。下面這段代碼演示了如何把一個執(zhí)行中的函數持久化保存,然后過段時間再把函數從上次執(zhí)行到的地方原樣拉起...
摘要:所以我們這里談的流程阻塞只是一種簡化的流程建模的實現(xiàn)。在某種意義下,阻塞和流程阻塞都是阻塞問題。 咱不咬文嚼字地掰什么是Blocking I/O,什么是Async I/O,沒啥意思。代碼是用來解決問題的。有的時候透徹理解問題,會比透徹理解某個具體的解法更重要。 I/O阻塞的問題來源就是,當我們需要輸入輸出的時候,特別是通過網絡傳輸數據的時候。從請求發(fā)出,到得到對方的應答確認是一段時間的...
摘要:標準的異常處理是這樣的這段代碼會打印出而不會打印出,因為異常會中斷當前流程,跳轉到部分去繼續(xù)執(zhí)行。這種行為類似里的。如何實現(xiàn)的其實原理上很簡單。的時候把當前協(xié)程的狀態(tài)保存起來,如果決定要,就把協(xié)程的時刻的狀態(tài)重新恢復然后從那個點繼續(xù)執(zhí)行。 標準的異常處理是這樣的 try: print(hello) raise Exception() print(!!!) ex...
摘要:另載于是個很爽的東西,線程安全,能當全局變量來用別。第一家公司,使用框架老技術,現(xiàn)代人可以理解為類似,對每個請求都套上,進入時把寫入,返回或拋注意時清理。第二家公司,某次引入一個設計,也用了來傳遞上下文信息,有的地方沒能清掉。 另載于 http://www.qingjingjie.com/blogs/12 ThreadLocal是個很爽的東西,線程安全,能當全局變量來用(別!)。 上一...
閱讀 3615·2021-11-22 09:34
閱讀 3186·2021-11-15 11:38
閱讀 3039·2021-10-27 14:16
閱讀 1233·2021-10-18 13:35
閱讀 2424·2021-09-30 09:48
閱讀 3429·2021-09-29 09:34
閱讀 1626·2019-08-30 15:54
閱讀 1818·2019-08-26 11:57