13 1 3 理解工作流的原理

2021-07-26 00:11:39 字數 1776 閱讀 6070

13.1.3 理解工作流的原理

從前一章我們知道,用計算表示式寫的 f# **,會由對應的計算生成器,轉換成使用基本操作的表示式。對於非同步工作流來說,let! 結構轉換成對 async.bind 的呼叫,return 轉換成 async.return;此外,非同步工作流自動延遲,因此,計算本身需要包裝成另外的基本操作,以確保整個**包含在乙個函式中,這個函式能夠在後面工作流啟動時執行。清單 13.3 是清單 13.2 工作流轉換後的版本。

清單13.3 顯式構造非同步工作流 (f#)

)))delay 成員把函式包裝成可以延遲執行的工作流。這個 lambda 函式的主體就作為乙個引數值,建立 http 請求,使用自定義的非同步值繫結,把值指定給 resp 符號。編譯器把每個 use 繫結轉換成對 using 成員的呼叫,這是另乙個基本操作,由計算表示式生成器提供的。它負責在工作流結束時,釋放物件,不管成功與否。

delay 成員是計算生成器成員之一,在實現計算表示式時提供。在清單 13.3 中,它把函式為引數,返回非同步工作流(型別是 unit ->async<』a>),返回的工作流,是包裝了這個函式的值(async<』a>)。有了這個基本操作,整個計算可以包含在乙個函式中,在建立 async<』a> 值時並不執行。這與前一章關於 option<』a> 型別的例子,完全不同。選項表示值,所以,計算表示式立即執行,並返回新的選項值;而工作流表示計算。當我們深入了解 async<』a> 型別之後,就會更清楚其意思。

在清單 13.3 中的另乙個基本操作是 bind 成員。從前一章我們知道,這是所有計算表示式的核心。在非同步工作流中,bind 可以啟動操作,而不阻塞呼叫者執行緒。我們使用基本操作,比如 async.runsynchronously,執行工作流時,到底會發生什麼:

非同步工作流的型別

使用非同步工作流,不一定非要了解所有的詳節,而可能對它是如何實現的,會有點興趣。我們已經知道,非同步工作流類似於函式,表示延遲執行的計算。在 f# 庫中,它的型別用函式表示;這個型別有點複雜,最簡單的非同步計算可能像下面這樣:

type async<』t> = ((『t -> unit) * (exn -> unit) * (unit -> unit)) –> unit

這是乙個函式,有三個引數組成元組,返回 unit 值。這三個引數很重要,因為它們是連續函式,在非同步工作流完成時呼叫。第乙個引數是成功時連續,型別為 『t -> unit,表示把工作流的結果作為引數,當工作流完成時,將呼叫這個連續,然後,它可以執行其他工作流,或者任何其他**。第二個引數是異常時連續,引數為 exn 值,這是 f# 對 .net exception 型別的縮寫,可以猜到,它是工作流執行失敗時的操作。第三個函式為取消時連續,工作流被取消時觸發。

雖然不需要完全了解非同步工作流的實現細節,但是,能夠建立自定義的工作流基本操作,相當於清單 13.3 中使用的 asyncgetresponse 方法,還是非常有用的。然後,可以使用其餘的構件(building blocks),不費什麼勁就能非同步執行自己的**了。

SpringMVC工作流理解

1a 客戶端發出http請求,只要請求形式符合web.xml 檔案中配置的 action的話,就由dispatcherservlet 來處理。1b dispatcherservlet再將http請求委託給對映器 的物件來將http請求交給對應的action來處理 2 對映器根據客戶的http請求,再...

理解InforFlow工作流模型

公飛 目前 工作流 已經成為乙個引人矚目的技術熱點,大量的應用解決方案正在考慮採用基於工作流技術實現。而學習工作流的關鍵在於對工作流模型的理解。下面就 一下對inforflow 中創軟體商用中介軟體 inforbus.的工作流中介軟體 工作流模型的理解。應用工作流的價值 工作流主要應用在具有流程處理...

工作流建模 工作流概念

工作流建模 工作流概念 1 案例 工作流系統得基本目的是處理案例。每個案例都有乙個唯一標識,而且每個案例的生命週期都是有限的。案例生命週期都處於某個特定狀態,該狀態由三個元素組成 1 案例相關的屬性的值 案例屬性是一系列同案例相關的變數。能夠用來管理案例。正是通過這些變數,才有可能指出在特定條件下某...