Lwt เป็นไลบรารีการเขียนโปรแกรมที่ทำงานพร้อมกันสำหรับ OCaml โดยให้ข้อมูลประเภทเดียว: สัญญา ซึ่งเป็นค่าที่จะถูกกำหนดในอนาคต การสร้างคำสัญญาทำให้เกิดการคำนวณ เมื่อการคำนวณนั้นเป็น I/O Lwt จะรันควบคู่ไปกับโค้ด OCaml ของคุณ
รหัส OCaml รวมถึงการสร้างและการรอสัญญา จะถูกเรียกใช้ในเธรดเดียวตามค่าเริ่มต้น ดังนั้นคุณจึงไม่ต้องกังวลเรื่องการล็อกหรือการจองล่วงหน้า คุณสามารถแยกโค้ดเพื่อเรียกใช้ในเธรดที่แยกจากกันได้โดยขึ้นอยู่กับการเลือกใช้
นี่คือโปรแกรม Lwt แบบง่ายซึ่งขอหน้าแรกของ Google และล้มเหลวหากคำขอไม่เสร็จสิ้นภายในห้าวินาที:
open Lwt.Syntax
let () =
let request =
let * addresses = Lwt_unix. getaddrinfo " google.com " " 80 " [] in
let google = Lwt_unix. (( List. hd addresses).ai_addr) in
Lwt_io. (with_connection google ( fun ( incoming , outgoing ) ->
let * () = write outgoing " GET / HTTP/1.1 rn " in
let * () = write outgoing " Connection: close rnrn " in
let * response = read incoming in
Lwt. return ( Some response)))
in
let timeout =
let * () = Lwt_unix. sleep 5. in
Lwt. return None
in
match Lwt_main. run ( Lwt. pick [request; timeout]) with
| Some response -> print_string response
| None -> prerr_endline " Request timed out " ; exit 1
(* ocamlfind opt -package lwt.unix -linkpkg example.ml && ./a.out *)
ในโปรแกรม ฟังก์ชันต่างๆ เช่น Lwt_io.write
จะสร้างสัญญา let* ... in
build ใช้เพื่อรอให้คำมั่นสัญญาถูกกำหนด รหัสหลังจาก in
ถูกกำหนดให้ทำงานใน "โทรกลับ" การแข่งขัน Lwt.pick
สัญญาต่อกันและทำหน้าที่เป็นการแข่งขันแรกที่เสร็จสิ้น Lwt_main.run
บังคับให้เครือข่ายการคำนวณสัญญาทั้งหมดถูกดำเนินการ รหัส OCaml ที่มองเห็นได้ทั้งหมดถูกรันในเธรดเดียว แต่ Lwt ภายในใช้การผสมผสานระหว่างเธรดของผู้ปฏิบัติงานและตัวอธิบายไฟล์ที่ไม่บล็อก เพื่อแก้ไขสัญญาที่ทำ I/O แบบขนาน
Lwt คอมไพล์เป็นโค้ดเนทิฟบน Linux, macOS, Windows และระบบอื่นๆ นอกจากนี้ยังได้รับการคอมไพล์เป็น JavaScript สำหรับส่วนหน้าและ Node เป็นประจำโดย js_of_ocaml
ใน Lwt
Lwt
ให้สัญญา ...Lwt_unix
ที่ผูกเกือบทุกการเรียกของระบบ Unix โมดูลระดับสูงกว่า Lwt_io
มีช่อง I/O ที่ดีLwt_process
ใช้สำหรับการจัดการกระบวนการย่อยLwt_preemptive
วางไข่เธรดระบบLwt_react
สำหรับการเขียนโปรแกรมเชิงโต้ตอบ ดูสารบัญในหน้าคู่มือที่เชื่อมโยง! libev-dev
หรือ libev-devel
opam install conf-libev lwt
ขณะนี้เรากำลังดำเนินการปรับปรุงเอกสาร Lwt (อย่างมาก เรากำลังเขียนคู่มือใหม่) ในระหว่างนี้:
หมายเหตุ: คู่มือส่วนใหญ่ในปัจจุบันอ้างถึง 'a Lwt.t
ว่า "เธรดแบบเบา" หรือเพียงแค่ "เธรด" สิ่งนี้จะได้รับการแก้ไขในคู่มือใหม่ 'a Lwt.t
เป็นคำมั่นสัญญา และไม่มีส่วนเกี่ยวข้องกับระบบหรือเธรดที่ยึดเอาเสียก่อน
เปิดปัญหา ไปที่แชท Discord ถามที่ Discussion.ocaml.org หรือบน Stack Overflow
การประกาศเปิดตัวมีอยู่ใน Discussion.ocaml.org การดู repo สำหรับ "รุ่นเฉพาะ" ก็เป็นทางเลือกเช่นกัน
CONTRIBUTING.md
มีเคล็ดลับในการทำงานกับโค้ด เช่น วิธีตรวจสอบโค้ด วิธีตรวจสอบ ฯลฯ นอกจากนี้ยังมีโครงร่างระดับสูงของฐานโค้ดอีกด้วย