成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

jsliang / 1156人閱讀

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

在史前的web開發(fā)時(shí)代(我說的是AngularJS工程師開始變得價(jià)值不菲之前的黑暗歲月),web開發(fā)的一個(gè)痛點(diǎn)在于HTTP是一個(gè)無狀態(tài)的協(xié)議,瀏覽器是一個(gè)無狀態(tài)的展示表單提交工具。當(dāng)然現(xiàn)在的web開發(fā)世界已經(jīng)不再是如此了,瀏覽器已經(jīng)儼然是一個(gè)全功能的客戶端了,B/S和C/S架構(gòu)的差異已經(jīng)接近彌合。在那個(gè)年代,有一些人就想,讓狀態(tài)從服務(wù)器傳到瀏覽器,然后再在瀏覽器提交表單的時(shí)候傳回來這多麻煩呀。如果能夠讓服務(wù)器保存表單狀態(tài),代碼寫起來該多么酷啊,比如下面這個(gè)例子(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

這段代碼實(shí)現(xiàn)的功能是在瀏覽器上顯示一個(gè)“0”,然后有++和--兩個(gè)鏈接。點(diǎn)++的話會(huì)提交一個(gè)HTTP請求給服務(wù)器,服務(wù)器返回一個(gè)新頁面,其上面顯示一個(gè)“1”。
背后的思想是把頁面上的內(nèi)容建模為一個(gè)狀態(tài),在代碼中這個(gè)狀態(tài)就是那個(gè)counter對象。counter對象的值是以協(xié)程的方式保存在服務(wù)器端的。不僅僅是counter的值,以及h.a("++").action(counter.increase)這樣綁定的事件與回調(diào)函數(shù)的映射也被保存了下來了。客戶端的操作通過HTTP發(fā)到服務(wù)器之后。服務(wù)器根據(jù)渲染頁面時(shí)注入的一些id表示符,找到對應(yīng)的協(xié)程,然后加載協(xié)程,再把協(xié)程往后執(zhí)行一步,同時(shí)渲染出一個(gè)新的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()就是一個(gè)大大的流程阻塞,當(dāng)然為什么不能用協(xié)程去對這個(gè)流程阻塞問題進(jìn)行建模呢。于是乎就有這些詭異的實(shí)現(xiàn)了。

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

    Jeff 評(píng)論0 收藏0
  • 慎用ThreadLocal

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

    harriszh 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<