package lwt

Build not checked
  1. Overview
  2. Docs
Promises and event-driven I/O

Install

dune-project
 Dependency

Authors

Maintainers

Sources

5.9.0.tar.gz
md5=763b9201c891f8c20ee02dec0af23355
sha512=35574743df40170a8d1676254952c060090421a40d5f8ad37a6691f4f8bb0e28fca61f5efff1050edc4f8a3ffa2f06a1e23d0c084c89bfc105c1235e249bbc75

Description

A promise is a value that may become determined in the future.

Lwt provides typed, composable promises. Promises that are resolved by I/O are resolved by Lwt in parallel.

Meanwhile, OCaml code, including code creating and waiting on promises, runs in a single thread by default. This reduces the need for locks or other synchronization primitives. Code can be run in parallel on an opt-in basis.

Added to opam-repository:

README

Lwt

version GitHub Actions status

Lwt is a concurrent programming library for OCaml. It provides a single data type: the promise, which is a value that will become determined in the future. Creating a promise spawns a computation. When that computation is I/O, Lwt runs it in parallel with your OCaml code.

OCaml code, including creating and waiting on promises, is run in a single thread by default, so you don't have to worry about locking or preemption. You can detach code to be run in separate threads on an opt-in basis.

Here is a simplistic Lwt program which requests the Google front page, and fails if the request is not completed in five seconds:

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\r\n" in
      let* () = write outgoing "Connection: close\r\n\r\n" 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 *)

In the program, functions such as Lwt_io.write create promises. The let* ... in construct is used to wait for a promise to become determined; the code after in is scheduled to run in a "callback." Lwt.pick races promises against each other, and behaves as the first one to complete. Lwt_main.run forces the whole promise-computation network to be executed. All the visible OCaml code is run in a single thread, but Lwt internally uses a combination of worker threads and non-blocking file descriptors to resolve in parallel the promises that do I/O.


Overview

Lwt compiles to native code on Linux, macOS, Windows, and other systems. It's also routinely compiled to JavaScript for the front end and Node by js_of_ocaml.

In Lwt,

  • The core library Lwt provides promises...
  • ...and a few pure-OCaml helpers, such as promise-friendly mutexes, condition variables, and mvars.
  • There is a big Unix binding, Lwt_unix that binds almost every Unix system call. A higher-level module Lwt_io provides nice I/O channels.
  • Lwt_process is for subprocess handling.
  • Lwt_preemptive spawns system threads.
  • The PPX syntax allows using all of the above without going crazy!
  • There are also some other helpers, such as Lwt_react for reactive programming. See the table of contents on the linked manual pages!

Installing

  1. Use your system package manager to install a development libev package. It is often called libev-dev or libev-devel.
  2. opam install conf-libev lwt

Documentation

We are currently working on improving the Lwt documentation (drastically; we are rewriting the manual). In the meantime:

  • The current manual can be found here.
  • Mirage has a nicely-written Lwt tutorial.
  • An example of a simple server written in Lwt.
  • Concurrent Programming with Lwt is a nice source of Lwt examples. They are translations of code from the excellent Real World OCaml, but are just as useful if you are not reading the book.

Note: much of the current manual refers to 'a Lwt.t as "lightweight threads" or just "threads." This will be fixed in the new manual. 'a Lwt.t is a promise, and has nothing to do with system or preemptive threads.


Contact

Open an issue, visit Discord chat, ask on discuss.ocaml.org, or on Stack Overflow.

Release announcements are made on discuss.ocaml.org. Watching the repo for "Releases only" is also an option.


Contributing

  • CONTRIBUTING.md contains tips for working on the code, such as how to check the code out, how review works, etc. There is also a high-level outline of the code base.
  • Ask us anything, whether it's about working on Lwt, or any question at all about it :)
  • The documentation always needs proofreading and fixes.
  • You are welcome to pick up any other issue, review a PR, add your opinion, etc.
  • Any feedback is welcome, including how to make contributing easier!

Libraries to use with Lwt

Dependencies (5)

  1. ocplib-endian
  2. dune-configurator
  3. cppo build & >= "1.1.0"
  4. ocaml >= "4.08" & < "5.5"
  5. dune >= "2.7"

Dev Dependencies (2)

  1. odoc with-doc & >= "2.3.0"
  2. ocamlfind with-dev-setup & >= "1.7.3-1"

  1. 0install >= "2.15.1"
  2. aches-lwt
  3. activitypub
  4. albatross
  5. alcotest-lwt
  6. alcotest-mirage
  7. ambient-context-lwt
  8. amqp-client >= "1.1.0"
  9. amqp-client-lwt
  10. angstrom-lwt-unix >= "0.11.0"
  11. anthill
  12. anycache-lwt
  13. archi-lwt
  14. arp
  15. atproto
  16. awa-mirage
  17. aws-lwt
  18. aws-s3-lwt >= "4.8.1"
  19. awskit-lwt
  20. awskit-lwt-unix
  21. awskit-s3-lwt
  22. awskit-s3-lwt-unix
  23. awsm-lwt
  24. awso-lwt
  25. azure-cosmos-db < "0.4.0"
  26. azure-cosmos-db-lwt
  27. balancer
  28. bastet_lwt
  29. bimage-lwt
  30. bistro
  31. bitflyer
  32. bizowie-api
  33. brisk-reconciler
  34. builder
  35. builder-web
  36. bun >= "0.3.3"
  37. cachet-lwt
  38. calculon
  39. caldav
  40. camltc
  41. canary
  42. capnp-rpc-lwt < "2.0"
  43. capnp-rpc-unix < "2.1"
  44. caqti-lwt
  45. caqti-mirage
  46. carton < "1.0.0"
  47. carton-git
  48. carton-lwt
  49. catala-format >= "0.2.0"
  50. cf-lwt
  51. chamelon
  52. chamelon-unix
  53. chamo
  54. charrua-client
  55. charrua-unix
  56. chess_com_api
  57. ciao_lwt
  58. clz
  59. cmdtui-lambda-term
  60. coap
  61. coap-server-lwt
  62. cohttp-curl-lwt
  63. cohttp-lwt
  64. cohttp-lwt-jsoo
  65. cohttp-lwt-unix
  66. cohttp-mirage
  67. cohttp-server-lwt-unix
  68. comby
  69. comby-semantic
  70. conan-lwt
  71. conduit-lwt
  72. conduit-lwt-unix
  73. cosmetyc_native
  74. cowabloga
  75. crunch
  76. cstruct-lwt
  77. csv-lwt
  78. ctypes >= "0.15.0" & < "0.21.1"
  79. ctypes-foreign >= "0.21.1"
  80. curl_lwt
  81. current
  82. current-albatross-deployer
  83. current_docker
  84. current_examples
  85. current_git
  86. current_github
  87. current_gitlab
  88. current_ocluster
  89. current_rpc
  90. current_slack
  91. current_web
  92. dap
  93. data-encoding < "0.1.1"
  94. devkit >= "1.2" & < "1.20261006"
  95. distributed-lwt
  96. dkim-bin < "0.8.0"
  97. dkim-lwt-unix
  98. dkim-mirage
  99. dlm
  100. dmarc
  101. dns-certify
  102. dns-cli
  103. dns-client < "7.0.3"
  104. dns-client-lwt
  105. dns-client-mirage
  106. dns-forward
  107. dns-forward-lwt-unix
  108. dns-lwt
  109. dns-mirage
  110. dns-resolver
  111. dns-server
  112. dns-stub
  113. dnsrobot
  114. dnssd
  115. docker_hub
  116. docteur >= "0.0.2"
  117. docteur-solo5
  118. docteur-unix >= "0.0.5"
  119. doi2bib
  120. dream
  121. dream-httpaf
  122. dream-mirage
  123. dream-pure
  124. dream-serve
  125. dropbox
  126. dune >= "3.17.2"
  127. dune-rpc-lwt
  128. earlybird
  129. elasticsearch-cli
  130. emoji = "2.0.0"
  131. equinoxe
  132. ethernet
  133. ez_api >= "1.2.0" & < "3.0.0"
  134. ezcurl-lwt
  135. ezjs_min < "0.2"
  136. ezjsonm-lwt
  137. ezresto
  138. ezresto-directory >= "0.5"
  139. faraday-lwt
  140. faraday-lwt-unix
  141. fat-filesystem
  142. fiber-lwt
  143. fsevents-lwt
  144. fswatch_lwt
  145. fuseau-lwt
  146. fxmacrodata
  147. gdbprofiler
  148. git
  149. git-cohttp
  150. git-cohttp-unix
  151. git-kv >= "0.2.0"
  152. git-mirage
  153. git-paf
  154. git-unix >= "3.2.0"
  155. github
  156. github-hooks
  157. github-unix >= "4.4.0"
  158. gitlab-unix
  159. gitlab_pipeline_notifier
  160. gluten-lwt
  161. gluten-lwt-unix < "0.4.0"
  162. gluten-mirage < "0.4.0"
  163. gmocoin
  164. granary
  165. granary_repl
  166. graphql-lwt
  167. gremlin
  168. grpc-lwt
  169. guardian
  170. gufo
  171. h1
  172. h1-lwt-unix
  173. h2-lwt
  174. h2-lwt-unix < "0.10.0"
  175. h2-mirage
  176. happy-eyeballs-lwt
  177. happy-eyeballs-mirage
  178. hidapi-lwt
  179. hiredis >= "0.6"
  180. hl_yaml
  181. hockmd
  182. http-lwt-client
  183. http-mirage-client
  184. http-multipart-formdata >= "2.0.0" & < "3.0.0"
  185. httpaf-lwt-unix
  186. httpun-lwt
  187. httpun-mirage
  188. httpun-ws-lwt
  189. hvsock
  190. i3ipc
  191. influxdb-lwt
  192. inotify >= "2.4"
  193. inquire < "0.3.0"
  194. interface-prime-lwt
  195. ip2location
  196. ip2locationio
  197. ip2whois
  198. ipv6-multicast-lwt
  199. irc-client-lwt
  200. irc-client-lwt-ssl
  201. irc-client-tls
  202. irmin
  203. irmin-bench
  204. irmin-chunk
  205. irmin-cli
  206. irmin-client
  207. irmin-containers
  208. irmin-fs
  209. irmin-git
  210. irmin-graphql
  211. irmin-http
  212. irmin-indexeddb
  213. irmin-layers
  214. irmin-mirage-git
  215. irmin-mirage-graphql
  216. irmin-pack
  217. irmin-server
  218. irmin-test
  219. irmin-unix
  220. irmin-watcher
  221. joolog
  222. jose < "0.9.0"
  223. js_of_ocaml-lwt
  224. jsoo_broadcastchannel
  225. jsoo_storage
  226. jupyter
  227. jupyter-kernel
  228. kafka < "0.5"
  229. kafka_lwt
  230. kappa-library
  231. ke >= "0.5"
  232. kinetic-client
  233. kubecaml
  234. lambda-runtime
  235. lambda-term
  236. lambda_streams_lwt
  237. launchd
  238. ldp
  239. learn-ocaml
  240. learn-ocaml-client
  241. ledgerwallet >= "0.4.0"
  242. letsencrypt < "2.0.0"
  243. letsencrypt-app
  244. letsencrypt-dns < "2.0.0"
  245. letters
  246. lichess_api
  247. links
  248. linol-lwt
  249. llama
  250. lru_cache
  251. lwt-canceler
  252. lwt-dllist
  253. lwt-exit
  254. lwt-parallel
  255. lwt-pipe
  256. lwt-pipeline
  257. lwt-watcher
  258. lwt_camlp4
  259. lwt_domain
  260. lwt_eio < "0.6"
  261. lwt_glib
  262. lwt_log
  263. lwt_ppx < "6.0.0~beta01"
  264. lwt_react
  265. lwt_retry
  266. lwt_ssl
  267. mariadb >= "1.2.0"
  268. markdown_monolith
  269. markup = "0.7.6"
  270. markup-lwt
  271. mdx
  272. mechaml
  273. mehari-lwt-unix
  274. mehari-mirage
  275. memtrace-mirage
  276. metrics-influx
  277. metrics-lwt
  278. metrics-unix
  279. migra
  280. mimic
  281. mindstorm-lwt
  282. mirage < "4.0.0"
  283. mirage-block >= "2.0.1"
  284. mirage-block-ccm
  285. mirage-block-combinators
  286. mirage-block-lwt
  287. mirage-block-partition
  288. mirage-block-ramdisk
  289. mirage-block-solo5
  290. mirage-block-unikraft
  291. mirage-block-unix >= "2.14.2"
  292. mirage-block-xen
  293. mirage-channel >= "4.0.1"
  294. mirage-channel-lwt
  295. mirage-clock-lwt
  296. mirage-clock-unix < "4.2.0"
  297. mirage-console-lwt
  298. mirage-crypto-rng < "0.11.3"
  299. mirage-crypto-rng-lwt
  300. mirage-crypto-rng-mirage
  301. mirage-device >= "2.0.0"
  302. mirage-flow >= "3.0.0"
  303. mirage-flow-combinators
  304. mirage-flow-lwt
  305. mirage-flow-unix
  306. mirage-fs >= "4.0.0"
  307. mirage-fs-lwt
  308. mirage-kv >= "3.0.1"
  309. mirage-kv-lwt
  310. mirage-kv-unix
  311. mirage-net >= "4.0.0"
  312. mirage-net-lwt
  313. mirage-net-macosx
  314. mirage-net-solo5
  315. mirage-net-unikraft
  316. mirage-net-unix
  317. mirage-net-xen
  318. mirage-profile
  319. mirage-protocols >= "7.0.0"
  320. mirage-protocols-lwt
  321. mirage-qubes
  322. mirage-qubes-ipv4
  323. mirage-runtime
  324. mirage-sleep
  325. mirage-solo5
  326. mirage-stack = "3.0.0"
  327. mirage-stack-lwt
  328. mirage-time >= "3.0.0"
  329. mirage-time-lwt
  330. mirage-time-unix
  331. mirage-types-lwt
  332. mirage-unikraft
  333. mirage-unix
  334. mirage-vnetif
  335. mirage-xen
  336. monorobot
  337. moonpool-lwt
  338. mosaic >= "0.2.0"
  339. mqtt
  340. mrmime >= "0.5.0"
  341. multipart-form-data
  342. multipart_form >= "0.2.0" & < "0.4.0"
  343. multipart_form-cohttp-lwt < "0.6.0"
  344. multipart_form-lwt
  345. mwt
  346. naboris
  347. nbd >= "4.0.3"
  348. nbd-tool
  349. nbd-unix
  350. neo4j_bolt
  351. nocrypto
  352. nottui-lwt
  353. notty-community
  354. nproc
  355. nsq
  356. obuilder
  357. obus >= "1.2.1"
  358. ocaml-ai-sdk
  359. ocluster
  360. ocluster-api
  361. ocluster-worker
  362. ocplib-resto
  363. ocsigenserver
  364. ocsipersist
  365. ocsipersist-dbm
  366. ocsipersist-lib
  367. ocsipersist-pgsql
  368. ocsipersist-sqlite
  369. oframl
  370. ohttp-cohttp-lwt
  371. ojs_base
  372. omigrate
  373. oneffs
  374. opam-check-npm-deps >= "4.1.0"
  375. opam-publish >= "3.0.0"
  376. opencage
  377. opentelemetry-client-cohttp-lwt
  378. opentelemetry-client-ocurl-lwt
  379. opentelemetry-cohttp-lwt >= "0.4"
  380. opentelemetry-lwt
  381. opium
  382. opium-graphql
  383. opium_kernel
  384. opomodoro
  385. order-i3-xfce
  386. ordma
  387. oskel >= "0.3.0"
  388. ounit-lwt < "2.2.0"
  389. ounit2-lwt
  390. owork
  391. ozulip
  392. paf
  393. paf-cohttp
  394. passage < "0.1.8"
  395. pcap-format < "0.5.2"
  396. petrol
  397. pgn_parser
  398. pgx_lwt
  399. pgx_lwt_mirage
  400. pgx_lwt_unix < "2.0"
  401. piaf < "0.2.0"
  402. picos >= "0.3.0" & < "0.5.0"
  403. picos_lwt
  404. picos_meta
  405. plebeia >= "2.0.0"
  406. plist-xml-lwt
  407. plotkicadsch
  408. posix-getopt >= "4.0.2"
  409. ppx_defer >= "0.4.0"
  410. ppx_deriving_rpc
  411. ppx_rapper_lwt
  412. privatus-analytics-dream
  413. proc-smaps
  414. prof_spacetime
  415. prometheus < "2.0"
  416. prometheus-app
  417. prometheus-lwt
  418. promise_jsoo_lwt
  419. protocol-9p
  420. protocol-9p-unix
  421. proton
  422. pxshot
  423. qcow
  424. qcow-stream
  425. qcow-tool
  426. qcow-types
  427. qdrant < "0.2.0"
  428. qfs
  429. quests
  430. quickterface
  431. rawlink < "2.1"
  432. rawlink-lwt
  433. rdf_json_ld
  434. rdf_lwt
  435. redis-lwt
  436. reparse-lwt
  437. reparse-lwt-unix
  438. resource-pooling
  439. resp
  440. resp-mirage >= "0.10.0"
  441. resp-unix >= "0.10.0"
  442. resto
  443. resto-cohttp-client >= "0.4"
  444. resto-cohttp-self-serving-client
  445. resto-cohttp-server >= "0.4" & < "0.6" | >= "0.9"
  446. resto-directory >= "0.4"
  447. ringo-lwt
  448. river
  449. rock
  450. rpclib-js
  451. rpclib-lwt
  452. SZXX < "4.0.0"
  453. sanddb
  454. scgi
  455. sendmail-lwt
  456. sendmail-mirage
  457. serial
  458. server-reason-react < "0.4.0"
  459. session-cohttp-lwt
  460. session-cookie-lwt
  461. session-postgresql-lwt
  462. sessions
  463. shared-block-ring
  464. shared-memory-ring-lwt
  465. sherlodoc
  466. sihl < "0.2.0"
  467. slack
  468. slacko
  469. slipshow < "0.12.0"
  470. smtml >= "0.7.0"
  471. speed
  472. spin < "0.8.0"
  473. spoke
  474. statocaml
  475. stk
  476. stog
  477. swapfs
  478. syguslib-utils
  479. syndic >= "1.4" & < "1.6.0"
  480. tar-mirage
  481. tar-unix
  482. tcpip
  483. telegraml
  484. terminus
  485. testcontainers
  486. testo-lwt
  487. tezt
  488. tidy_email
  489. timmy-lwt
  490. tls >= "0.10.6" & < "0.16.0"
  491. tls-lwt
  492. tls-mirage
  493. tube
  494. tuntap
  495. twirp_cohttp_lwt_unix
  496. uring
  497. uspf
  498. uspf-lwt
  499. uspf-mirage
  500. utcp
  501. utop
  502. uwt
  503. vchan
  504. vchan-unix
  505. vchan-xen
  506. vercel
  507. vhd-format-lwt
  508. vmnet
  509. vue-jsoo < "0.3"
  510. wayland < "2.0"
  511. webauthn
  512. xen-evtchn
  513. xen-evtchn-unix
  514. xen-gnt
  515. xen-gnt-unix
  516. xenstore
  517. xenstore-tool
  518. xenstore_transport
  519. xlsx2csv
  520. yocaml_git
  521. yocaml_unix < "2.0.0"
  522. zarr-lwt
  523. zmq-lwt >= "5.2.1"

Conflicts

None

Build status

Results of building lwt with each compiler on check.ci.ocaml.org, run of against opam-repository 8a77e58. All results for this package.

Each result links to its build log. To keep crawlers from overloading the site, build logs require a GitHub sign-in (see ocurrent/opam-health-check). On your first log, GitHub asks you to “Authorize opam-health-check”, the OCurrent app that runs these checks; it sees only your public profile, not your repositories. The sign-in lasts 30 days.

This version is not in the latest run; the versions below are.

Version OCaml 4.11 OCaml 4.14 OCaml 5.2 OCaml 5.4 OCaml 5.5
6.1.2 n/a good good good good
5.10.1 good good good good good
  • good Package successfully built
  • partial One of the dependencies failed to build
  • bad Package failed to build
  • n/a Package is not available in this environment
  • internal Internal failure