安全的直接式並發和彈性在JVM上的彈性。需要JDK 21和Scala 3。我們要用OX覆蓋的區域是:
以上所有這些都應允許精心策劃的業務邏輯可觀察到。我們旨在以功能樣式寫作簡單,面向表達的代碼。我們想將語法開銷降至最低,從而保留開發人員友好的堆棧痕跡,而不會損害性能。
以上一些已經在API中解決了,其中一些已經在將來出現。我們希望您在塑造該項目方面的幫助!
要測試OX,請使用以下依賴性,使用任何一個SBT:
" com.softwaremill.ox " %% " core " % " 0.5.3 "
或scala-cli:
//> using dep " com.softwaremill.ox::core:0.5.3 "
文檔可在https://ox.softwaremill.com上獲得,可以在https://javadoc.io上瀏覽scaladocs。
並行運行兩個計算:
def computation1 : Int = { sleep( 2 .seconds); 1 }
def computation2 : String = { sleep( 1 .second); " 2 " }
val result1 : ( Int , String ) = par(computation1, computation2)
// (1, "2")
超時計算:
def computation3 : Int = { sleep( 2 .seconds); 1 }
val result2 : Either [ Throwable , Int ] = either.catching(timeout( 1 .second)(computation3))
// `timeout` only completes once the loosing branch is interrupted & done
種族兩個計算:
def computation4 : Int = { sleep( 2 .seconds); 1 }
def computation5 : Int = { sleep( 1 .second); 2 }
val result3 : Int = raceSuccess(computation4, computation5)
// as before, the loosing branch is interrupted & awaited before returning a result
結構化並發和監督:
// equivalent of par
supervised {
val f1 = fork { sleep( 2 .seconds); 1 }
val f2 = fork { sleep( 1 .second); 2 }
(f1.join(), f2.join())
}
在結構化並發範圍內處理錯誤:
supervised {
forkUser :
sleep( 1 .second)
println( " Hello! " )
forkUser :
sleep( 500 .millis)
throw new RuntimeException ( " boom! " )
}
// on exception, all other forks are interrupted ("let it crash")
// the scope ends & re-throws only when all forks complete (no "leftovers")
重試計算:
def computationR : Int = ???
retry( RetryConfig .backoff( 3 , 100 .millis, 5 .minutes, Jitter . Equal ))(computationR)
重複一個計算:
def computationR : Int = ???
repeat( RepeatConfig .fixedRateForever( 100 .millis))(computationR)
在範圍中分配資源:
supervised {
val writer = useCloseableInScope( new java.io. PrintWriter ( " test.txt " ))
// ... use writer ...
} // writer is closed when the scope ends (successfully or with an error)
創建一個用Sigint/Sigterm中斷時可干淨關閉的應用程序:
object MyApp extends OxApp :
def run ( args : Vector [ String ])( using Ox ) : ExitCode =
// ... your app's code ...
// might use fork {} to create top-level background threads
ExitCode . Success
簡單的類型安全演員:
class Stateful { def increment ( delta : Int ) : Int = ??? }
supervised :
val ref = Actor .create( new Stateful )
// ref can be shared across forks, but only within the concurrency scope
ref.ask(_.increment( 5 ))
使用功能API創建簡單的流程和變換:
Flow .iterate( 0 )(_ + 1 ) // natural numbers
.filter(_ % 2 == 0 )
.map(_ + 1 )
.intersperse( 5 )
// compute the running total
.mapStateful(() => 0 ) { (state, value) =>
val newState = state + value
(newState, newState)
}
.take( 10 )
.runForeach(n => println(n.toString))
創建執行I/O並管理並發的流量:
def sendHttpRequest ( entry : String ) : Unit = ???
Flow
.fromInputStream( this .getClass().getResourceAsStream( " /list.txt " ))
.linesUtf8
.mapPar( 4 )(sendHttpRequest)
.runDrain()
合併兩個流,正確處理任一分支的失敗:
val f1 = Flow .tick( 123 .millis, " left " )
val f2 = Flow .tick( 312 .millis, " right " )
f1.merge(f2).take( 100 ).runForeach(println)
使用命令式API將流與其他組件集成:
def readNextBatch () : List [ String ] = ???
Flow .usingEmit { emit =>
forever :
readNextBatch().foreach(emit.apply)
}
使用可完整的高性能渠道在並發範圍內進行梭哈交流:
val c = Channel .buffered[ String ]( 8 )
c.send( " Hello, " )
c.send( " World " )
c.done()
從類似頻道中選擇:
val c = Channel .rendezvous[ Int ]
val d = Channel .rendezvous[ Int ]
select(c.sendClause( 10 ), d.receiveClause)
取消包裝並將錯誤結合在聯合類型中:
val v1 : Either [ Int , String ] = ???
val v2 : Either [ Long , String ] = ???
val result : Either [ Int | Long , String ] = either :
v1.ok() ++ v2.ok()
管道和點擊值供函數使用點 - 索納克斯:
def compute : Int = ???
def computeMore ( v : Int ) : Long = ???
compute
.pipe( 2 * _)
.tap(println)
.pipe(computeMore)
在文檔中更多!
直接風格的Scala的更廣泛目標是使團隊能夠自信地快速交付工作軟件。我們的其他項目,包括STTP客戶端和Tapir,還包括直接針對直接風格量身定制的集成。
此外,還可以查看齒輪項目,這是一個實驗性的多平台庫,還涵蓋了直接風格的Scala。
歡迎所有建議:)
要編譯和測試,運行:
sbt compile
sbt test
查看問題列表,然後選擇一個!或報告自己的。
如果您對某事的原因或方式有疑問,請隨時提出有關話語或通過Github的問題。這可能意味著文檔,scaladocs或代碼尚不清楚,可以改進所有人。
為了開發文檔,您可以使用doc/watch.sh
腳本,該腳本使用Python運行sphinx。使用doc/requirements.txt
通過pip
設置您的Python環境。另外,如果您是Nix用戶,請在doc/
nix develop
,以啟動具有允許運行watch.sh
的環境的外殼。此外,您可以使用compileDocumentation
SBT任務來驗證所有代碼段正確編譯。
準備好公關後,請查看我們的“如何準備好PR”指南。謝謝! :)
我們提供商業開發服務。與我們聯繫以了解有關我們的更多信息!
版權(C)2023-2024 SoftWaremill https://softwaremill.com。