国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【妙用協(xié)程】 - 詭異的web框架

jsliang / 1144人閱讀

摘要:點的話會提交一個請求給服務器,服務器返回一個新頁面,其上面顯示一個。對象的值是以協(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

相關文章

  • 妙用協(xié)程】 - 單元測試setUp和tearDown

    摘要:一般的做法是把這些動作寫在和的兩個方法里,單元測試框架會負責在開始和結束的時候調用這兩個方法。從視覺上無法直觀的指導原來和是一對的。然后再把這個小的上下文附著到主測試邏輯上這里利用了單元測試的的特性,把轉化為回調在的時候就設置好。 很多測試都需要在啟動的時候做一些事情,然后在結束的時候再把做的事情給清理了。一般的做法是把這些動作寫在setUp和tearDown的兩個方法里,單元測試框架...

    MartinDai 評論0 收藏0
  • 妙用協(xié)程】 - 可持久化協(xié)程能被用來實現(xiàn)工作流

    摘要:常規(guī)版本的的是不可以被持久化保存的。在流程被阻塞的時候比如需要審批老板不在把協(xié)程持久化成入庫,等流程不再阻塞的時候把協(xié)程重新從數據庫里拉起來繼續(xù)執(zhí)行。 常規(guī)版本的Python的generator是不可以被持久化保存的。但是stackless和pypy這兩個修改版本的Python解釋器可以。下面這段代碼演示了如何把一個執(zhí)行中的函數持久化保存,然后過段時間再把函數從上次執(zhí)行到的地方原樣拉起...

    wpw 評論0 收藏0
  • 妙用協(xié)程】 - I/O阻塞和流程阻塞

    摘要:所以我們這里談的流程阻塞只是一種簡化的流程建模的實現(xiàn)。在某種意義下,阻塞和流程阻塞都是阻塞問題。 咱不咬文嚼字地掰什么是Blocking I/O,什么是Async I/O,沒啥意思。代碼是用來解決問題的。有的時候透徹理解問題,會比透徹理解某個具體的解法更重要。 I/O阻塞的問題來源就是,當我們需要輸入輸出的時候,特別是通過網絡傳輸數據的時候。從請求發(fā)出,到得到對方的應答確認是一段時間的...

    xinhaip 評論0 收藏0
  • 妙用協(xié)程】 - 可resume異常處理

    摘要:標準的異常處理是這樣的這段代碼會打印出而不會打印出,因為異常會中斷當前流程,跳轉到部分去繼續(xù)執(zhí)行。這種行為類似里的。如何實現(xiàn)的其實原理上很簡單。的時候把當前協(xié)程的狀態(tài)保存起來,如果決定要,就把協(xié)程的時刻的狀態(tài)重新恢復然后從那個點繼續(xù)執(zhí)行。 標準的異常處理是這樣的 try: print(hello) raise Exception() print(!!!) ex...

    Jeff 評論0 收藏0
  • 慎用ThreadLocal

    摘要:另載于是個很爽的東西,線程安全,能當全局變量來用別。第一家公司,使用框架老技術,現(xiàn)代人可以理解為類似,對每個請求都套上,進入時把寫入,返回或拋注意時清理。第二家公司,某次引入一個設計,也用了來傳遞上下文信息,有的地方沒能清掉。 另載于 http://www.qingjingjie.com/blogs/12 ThreadLocal是個很爽的東西,線程安全,能當全局變量來用(別!)。 上一...

    harriszh 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<