• 网友对twisted deferr的理解


    事實上Deferred的確就像是一連串的動作,用callback的形式被串在一起,我們用deferred或許可以這樣寫

    d.addCallback(洗菜)
    d.addCallback(切菜)
    d.addCallback(放到鍋中)
    d.addCallback(加鹽)

    如果只是這樣看起來就像是單純的責任鍊,做完一件事情把結果往下丟,但是,如果發生例外呢?

    def 切菜(data):
    raise 切到手指('Ouch!')

    如果只是單純的責任鍊,會從最初呼叫它的地方丟出來,如果只是一般的單thread程式這樣跑下來,其實加上一個try except就可以抓到了,但
    是twisted是處理非同步的事件,所有事件都是由reactor.run()來驅動的,例外如果從run裡被丟出來,除了整個程序就停止了之外,我
    們想去處理那些例外也就辦不到,因此它的error callback機制,目的就是在讓使用者也可以處理到錯誤

    像這樣
    d.addCallback(切菜)
    d.addErrback(處理切菜錯誤)

    除此之外他還有很多特異功能,有用平鋪直述的寫法所沒有的好處,我們這樣假設,炒菜是一件需要卡住整個線程執行三分鐘的事情,如果用直述的寫法

    加鹽(ret)
    炒菜(ret) # 我們會在這裡等三分鐘

    這對於非同步的處理來說無疑的是一大致命傷,後面還一堆事件處理,卻有個笨蛋為了炒菜佔了大家三分鐘時間,在這三分鐘裡其它事件都沒辦法被處理,像這個
    時候怎麼辦? 用Deferred的好處就來了

    def _炒菜(data):
    # 花三分鐘炒菜

    def 炒菜(data):
    return threads.deferredInThread(_炒菜) # api名稱我不確定 不過應該差不了多少

    那對deferred的操作會像這樣

    d.addCallback(加鹽)
    d.addCallback(炒菜)
    d.addCallback(上菜)

    看到了沒有,很奇怪不是嗎? 我們的炒菜callback居然也回傳一個deferred物件,twisted到底會怎麼做? 把deferred物件
    丟給上菜嗎? 答案是,twisted會等那個deferred物件callback,然後把回傳值丟給上菜,很奇妙不是嗎? 他會幫你把
    deferred串接起來,因此deferred不是多此一舉的東西,而是帶來非同步程式非常大彈性的美麗設計,當你越瞭解deferred,你會覺得
    這個設計真的很棒

    以上

  • 相关阅读:
    用java在mysql中随机插入9000 000条数据
    java连接mysql的一个小例子
    JDK环境变量配置
    JVM工作原理
    线程和进程的区别
    java实现链表
    内连接、外连接、左连接、右连接
    udp协议
    要看的东西
    eclipse快捷键
  • 原文地址:https://www.cnblogs.com/bjdxy/p/3200932.html
Copyright © 2020-2023  润新知