亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

jsliang / 1210人閱讀

摘要:點的話會提交一個請求給服務(wù)器,服務(wù)器返回一個新頁面,其上面顯示一個。對象的值是以協(xié)程的方式保存在服務(wù)器端的。類似的想法最出名的框架是的。于是乎就有這些詭異的實現(xiàn)了。

在史前的web開發(fā)時代(我說的是AngularJS工程師開始變得價值不菲之前的黑暗歲月),web開發(fā)的一個痛點在于HTTP是一個無狀態(tài)的協(xié)議,瀏覽器是一個無狀態(tài)的展示表單提交工具。當(dāng)然現(xiàn)在的web開發(fā)世界已經(jīng)不再是如此了,瀏覽器已經(jīng)儼然是一個全功能的客戶端了,B/S和C/S架構(gòu)的差異已經(jīng)接近彌合。在那個年代,有一些人就想,讓狀態(tài)從服務(wù)器傳到瀏覽器,然后再在瀏覽器提交表單的時候傳回來這多麻煩呀。如果能夠讓服務(wù)器保存表單狀態(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請求給服務(wù)器,服務(wù)器返回一個新頁面,其上面顯示一個“1”。
背后的思想是把頁面上的內(nèi)容建模為一個狀態(tài),在代碼中這個狀態(tài)就是那個counter對象。counter對象的值是以協(xié)程的方式保存在服務(wù)器端的。不僅僅是counter的值,以及h.a("++").action(counter.increase)這樣綁定的事件與回調(diào)函數(shù)的映射也被保存了下來了??蛻舳说牟僮魍ㄟ^HTTP發(fā)到服務(wù)器之后。服務(wù)器根據(jù)渲染頁面時注入的一些id表示符,找到對應(yīng)的協(xié)程,然后加載協(xié)程,再把協(xié)程往后執(zhí)行一步,同時渲染出一個新的HTML頁面,返回給客戶端。類似的想法最出名的框架是smalltalk的seaside。
假設(shè)我們是服務(wù)器,當(dāng)我們把頁面發(fā)給客戶端之后,等待客戶端的返回,然后根據(jù)返回執(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()就是一個大大的流程阻塞,當(dāng)然為什么不能用協(xié)程去對這個流程阻塞問題進(jìn)行建模呢。于是乎就有這些詭異的實現(xiàn)了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/45299.html

相關(guān)文章

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

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

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

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

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

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

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

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

    Jeff 評論0 收藏0
  • 慎用ThreadLocal

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

    harriszh 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<