From fd6efd64d0374323e76eaf6cb12ab1204dae3063 Mon Sep 17 00:00:00 2001 From: danny <540021730@qq.com> Date: Fri, 13 Sep 2024 18:18:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=AE=8F=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/advanced_rust.iml | 5 + Cargo.lock | 844 ++++++++++++++++-- Cargo.toml | 20 +- README.md | 40 +- app/Cargo.toml | 10 +- app/src/main.rs | 8 - chapter01-log/Cargo.toml | 11 +- chapter01-log/examples/log1-env_logger.rs | 16 + chapter01-log/examples/log2-tracing.rs | 7 + chapter01-log/log.md | 113 ++- chapter06-type/src/type3-related-trait.rs | 2 +- chapter09-hash/{hashmap.md => hash.md} | 0 chapter11-closure/closure.md | 6 +- chapter12-unsafe/unsafe.md | 12 +- chapter13-atomic_n_ordering/Cargo.toml | 14 + chapter13-atomic_n_ordering/ordering.md | 76 ++ chapter13-atomic_n_ordering/src/ordering1.rs | 42 + chapter13-atomic_n_ordering/src/ordering2.rs | 42 + chapter14-concurrecy/Cargo.toml | 58 ++ chapter14-concurrecy/concurrency.md | 29 + chapter14-concurrecy/src/01_convar.md | 50 ++ chapter14-concurrecy/src/02_future.md | 217 +++++ chapter14-concurrecy/src/03_tokio.md | 123 +++ .../src/concurrency1_convar.rs | 56 ++ .../src/concurrency2_future.rs | 28 + .../src/concurrency3_stream.rs | 10 + .../src/concurrency4_pin_stack.rs | 61 ++ .../src/concurrency5_pin_heap.rs | 40 + .../src/concurrency6_tokio_main.rs | 15 + .../src/concurrency7_tokio_mpsc.rs | 20 + .../src/concurrency8_tokio_watch.rs | 28 + .../src/concurrency9_tokio_select.rs | 24 + chapter14-concurrecy/src/reactor.png | Bin 0 -> 96594 bytes .../src/runtime-scheduler.png | Bin 0 -> 41726 bytes .../src/tokio_and_run_queue.png | Bin 0 -> 132254 bytes chapter15-macro/Cargo.toml | 42 + .../examples/macro1-declarativemacro.rs | 48 + .../macro2-declarativemacro-hygiene.rs | 39 + .../examples/macro3-derive-macro.rs | 30 + .../examples/macro4-attribute-macro.rs | 16 + chapter15-macro/macro.md | 315 +++++++ chapter15-macro/src/builder.rs | 160 ++++ chapter15-macro/src/lib.rs | 43 + 43 files changed, 2601 insertions(+), 119 deletions(-) create mode 100644 chapter01-log/examples/log1-env_logger.rs create mode 100644 chapter01-log/examples/log2-tracing.rs rename chapter09-hash/{hashmap.md => hash.md} (100%) create mode 100644 chapter13-atomic_n_ordering/Cargo.toml create mode 100644 chapter13-atomic_n_ordering/ordering.md create mode 100644 chapter13-atomic_n_ordering/src/ordering1.rs create mode 100644 chapter13-atomic_n_ordering/src/ordering2.rs create mode 100644 chapter14-concurrecy/Cargo.toml create mode 100644 chapter14-concurrecy/concurrency.md create mode 100644 chapter14-concurrecy/src/01_convar.md create mode 100644 chapter14-concurrecy/src/02_future.md create mode 100644 chapter14-concurrecy/src/03_tokio.md create mode 100644 chapter14-concurrecy/src/concurrency1_convar.rs create mode 100644 chapter14-concurrecy/src/concurrency2_future.rs create mode 100644 chapter14-concurrecy/src/concurrency3_stream.rs create mode 100644 chapter14-concurrecy/src/concurrency4_pin_stack.rs create mode 100644 chapter14-concurrecy/src/concurrency5_pin_heap.rs create mode 100644 chapter14-concurrecy/src/concurrency6_tokio_main.rs create mode 100644 chapter14-concurrecy/src/concurrency7_tokio_mpsc.rs create mode 100644 chapter14-concurrecy/src/concurrency8_tokio_watch.rs create mode 100644 chapter14-concurrecy/src/concurrency9_tokio_select.rs create mode 100644 chapter14-concurrecy/src/reactor.png create mode 100644 chapter14-concurrecy/src/runtime-scheduler.png create mode 100644 chapter14-concurrecy/src/tokio_and_run_queue.png create mode 100644 chapter15-macro/Cargo.toml create mode 100644 chapter15-macro/examples/macro1-declarativemacro.rs create mode 100644 chapter15-macro/examples/macro2-declarativemacro-hygiene.rs create mode 100644 chapter15-macro/examples/macro3-derive-macro.rs create mode 100644 chapter15-macro/examples/macro4-attribute-macro.rs create mode 100644 chapter15-macro/macro.md create mode 100644 chapter15-macro/src/builder.rs create mode 100644 chapter15-macro/src/lib.rs diff --git a/.idea/advanced_rust.iml b/.idea/advanced_rust.iml index b833a0e..e9036cf 100644 --- a/.idea/advanced_rust.iml +++ b/.idea/advanced_rust.iml @@ -18,6 +18,11 @@ + + + + + diff --git a/Cargo.lock b/Cargo.lock index 3ea5ed3..f27061b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,21 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" version = "1.1.3" @@ -11,6 +26,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + [[package]] name = "app" version = "0.1.0" @@ -18,8 +39,132 @@ dependencies = [ "chapter01", "chapter02", "serde", - "tracing", - "tracing-subscriber", +] + +[[package]] +name = "arrayref" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "askama" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb98f10f371286b177db5eeb9a6e5396609555686a35e1d4f7b9a9c6d8af0139" +dependencies = [ + "askama_derive", + "askama_escape", + "askama_shared", +] + +[[package]] +name = "askama_derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87bf87e6e8b47264efa9bde63d6225c6276a52e05e91bf37eaa8afd0032d6b71" +dependencies = [ + "askama_shared", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "askama_escape" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" + +[[package]] +name = "askama_shared" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf722b94118a07fcbc6640190f247334027685d4e218b794dbfe17c32bf38ed0" +dependencies = [ + "askama_escape", + "humansize", + "mime", + "mime_guess", + "nom", + "num-traits", + "percent-encoding", + "proc-macro2", + "quote", + "serde", + "syn 1.0.109", + "toml", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "blake3" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "bytes" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" + +[[package]] +name = "cc" +version = "1.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +dependencies = [ + "shlex", ] [[package]] @@ -32,6 +177,8 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" name = "chapter01" version = "0.1.0" dependencies = [ + "env_logger", + "log", "serde", "tracing", "tracing-subscriber", @@ -94,6 +241,45 @@ version = "0.1.0" name = "chapter12-unsafe" version = "0.1.0" +[[package]] +name = "chapter13-ordering" +version = "0.1.0" + +[[package]] +name = "chapter14-concurrecy" +version = "0.1.0" +dependencies = [ + "anyhow", + "blake3", + "futures", + "parking_lot", + "rayon", + "serde", + "serde_yaml", + "tokio", + "tokio-stream", + "tokio-util", + "toml", +] + +[[package]] +name = "chapter15-macro" +version = "0.1.0" +dependencies = [ + "anyhow", + "askama", + "darling", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "crossbeam-deque" version = "0.8.5" @@ -120,12 +306,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] -name = "deranged" -version = "0.3.11" +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ - "powerfmt", + "darling_core", + "quote", + "syn 1.0.109", ] [[package]] @@ -134,6 +346,25 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "env_logger" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -143,6 +374,140 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.75", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "humansize" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02296996cb8796d7c6e3bc2d9211b7802812d36999a51bb754123ead7d37d026" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.5.0" @@ -153,6 +518,16 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "itoa" version = "1.0.11" @@ -166,26 +541,92 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "log" -version = "0.4.22" +name = "libc" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] -name = "matchers" -version = "0.1.0" +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "lock_api" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ - "regex-automata 0.1.10", + "autocfg", + "scopeguard", ] +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "wasi", + "windows-sys", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -197,10 +638,22 @@ dependencies = [ ] [[package]] -name = "num-conv" -version = "0.1.0" +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +dependencies = [ + "memchr", +] [[package]] name = "once_cell" @@ -214,6 +667,29 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -227,10 +703,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] -name = "powerfmt" -version = "0.2.0" +name = "pin-utils" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "proc-macro2" @@ -271,24 +747,24 @@ dependencies = [ ] [[package]] -name = "regex" -version = "1.10.6" +name = "redox_syscall" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "bitflags", ] [[package]] -name = "regex-automata" -version = "0.1.10" +name = "regex" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ - "regex-syntax 0.6.29", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] @@ -299,20 +775,20 @@ checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] -name = "regex-syntax" -version = "0.8.4" +name = "rustc-demangle" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "ryu" @@ -320,6 +796,12 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "serde" version = "1.0.208" @@ -337,7 +819,7 @@ checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.75", ] [[package]] @@ -352,6 +834,18 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_yaml" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" +dependencies = [ + "indexmap", + "ryu", + "serde", + "yaml-rust", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -361,12 +855,63 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + [[package]] name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.75" @@ -378,6 +923,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.63" @@ -395,7 +949,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.75", ] [[package]] @@ -409,50 +963,82 @@ dependencies = [ ] [[package]] -name = "time" -version = "0.3.36" +name = "tinyvec" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", + "tinyvec_macros", ] [[package]] -name = "time-core" -version = "0.1.2" +name = "tinyvec_macros" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] -name = "time-macros" -version = "0.2.18" +name = "tokio" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ - "num-conv", - "time-core", + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys", ] [[package]] -name = "tinyvec" -version = "1.8.0" +name = "tokio-macros" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ - "tinyvec_macros", + "proc-macro2", + "quote", + "syn 2.0.75", ] [[package]] -name = "tinyvec_macros" -version = "0.1.1" +name = "tokio-stream" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] [[package]] name = "tracing" @@ -473,7 +1059,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.75", ] [[package]] @@ -497,36 +1083,27 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-serde" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" -dependencies = [ - "serde", - "tracing-core", -] - [[package]] name = "tracing-subscriber" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ - "matchers", "nu-ansi-term", - "once_cell", - "regex", - "serde", - "serde_json", "sharded-slab", "smallvec", "thread_local", - "time", - "tracing", "tracing-core", "tracing-log", - "tracing-serde", +] + +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", ] [[package]] @@ -567,6 +1144,18 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "winapi" version = "0.3.9" @@ -583,8 +1172,99 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] diff --git a/Cargo.toml b/Cargo.toml index 960746c..c7f5031 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,20 @@ [workspace] -members = ["app", "chapter01-log", - "chapter02-feature", "chapter03-ownership", - "chapter04-lifecycle", "chapter05-memory", "chapter06-type", - "chapter07-pointer", "chapter08-vec", "chapter09-hash", "chapter10-error", "chapter11-closure", "chapter12-unsafe"] +members = ["app", + "chapter01-log", + "chapter02-feature", + "chapter03-ownership", + "chapter04-lifecycle", + "chapter05-memory", + "chapter06-type", + "chapter07-pointer", + "chapter08-vec", + "chapter09-hash", + "chapter10-error", + "chapter11-closure", + "chapter12-unsafe", + "chapter13-atomic_n_ordering", + "chapter14-concurrecy", + "chapter15-macro"] [workspace.dependencies] diff --git a/README.md b/README.md index 1790d59..2698300 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - [**rust 背包客**](#rust-%E8%83%8C%E5%8C%85%E5%AE%A2) + - [第一章:log 日志](#%E7%AC%AC%E4%B8%80%E7%AB%A0log-%E6%97%A5%E5%BF%97) - [第二章:feature 条件编译](#%E7%AC%AC%E4%BA%8C%E7%AB%A0feature-%E6%9D%A1%E4%BB%B6%E7%BC%96%E8%AF%91) - [第三章:所有权](#%E7%AC%AC%E4%B8%89%E7%AB%A0%E6%89%80%E6%9C%89%E6%9D%83) - [第四章:生命周期](#%E7%AC%AC%E5%9B%9B%E7%AB%A0%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F) @@ -14,6 +15,9 @@ - [第十章:error 错误处理](#%E7%AC%AC%E5%8D%81%E7%AB%A0error-%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86) - [第十一章:闭包](#%E7%AC%AC%E5%8D%81%E4%B8%80%E7%AB%A0%E9%97%AD%E5%8C%85) - [第十二章:unsafe](#%E7%AC%AC%E5%8D%81%E4%BA%8C%E7%AB%A0unsafe) + - [第十三章:atomic and ordering](#%E7%AC%AC%E5%8D%81%E4%B8%89%E7%AB%A0atomic-and-ordering) + - [第十四章:并发处理](#%E7%AC%AC%E5%8D%81%E5%9B%9B%E7%AB%A0%E5%B9%B6%E5%8F%91%E5%A4%84%E7%90%86) + - [第十五章:宏编程](#%E7%AC%AC%E5%8D%81%E4%BA%94%E7%AB%A0%E5%AE%8F%E7%BC%96%E7%A8%8B) - [参考](#%E5%8F%82%E8%80%83) @@ -24,6 +28,11 @@ [cargo workspace来管理多个package](workspace.md) +## [第一章:log 日志](chapter01-log/log.md) + +- 1 env_logger 记录日志 +- 2 tracing 记录日志 + ## [第二章:feature 条件编译](chapter02-feature/feature.md) ## [第三章:所有权](chapter03-ownership/ownership.md) @@ -73,7 +82,7 @@ - [2 动态数组 Vector 和 数组 [T; n] 如何转化成 &[T]](chapter08-vec/src/vec2-slice.rs) - [3 String、&String 转换成 &str](chapter08-vec/src/vec3-string-slice.rs) -## [第九章:hash](chapter09-hash/hashmap.md) +## [第九章:hash](chapter09-hash/hash.md) - [1 hashmap cap 扩容和缩容](chapter09-hash/src/hash1-cap.rs) - 2 HashSet @@ -91,10 +100,39 @@ - [1 开发者还是调用者保证内存安全](chapter12-unsafe/src/unsafe1-caller.rs) +## [第十三章:atomic and ordering](chapter13-atomic_n_ordering/ordering.md) + +- 1 验证 Ordering 的可见性:两线程并发增加值 + - 容易大于 1000000 + - 最多只能 1000000 + +## 第十四章:并发处理 + +- [1 Condvar 条件变量](chapter14-concurrecy/src/01_convar.md) +- [2 Future](chapter14-concurrecy/src/02_future.md) + - 2.1 await 来执行 future,或则使用一个 executor 来执行 future + - 2.2 将值固定到栈上 + - 2.3 将值固定到堆上 + - 2.4 将固定住的 Future 变为 Unpin +- [3 tokio](chapter14-concurrecy/src/03_tokio.md) + - 3.1 #[tokio::main] 的作用 + - 3.2 消息通道: mpsc 多生产者,单消费者模式 + - 3.3 消息通道: watch 单生产者、多消费者 + +## [第十五章:宏编程](chapter15-macro/macro.md) + +- 1 声明宏(declarative macro) + - [1.1 vec! 实现](chapter15-macro/examples/macro1-declarativemacro.rs) + - [1.2 声明宏的 hygiene:宏内部代码和宏上下文相互影响](chapter15-macro/examples/macro2-declarativemacro-hygiene.rs) +- 2 过程宏(procedural macro) + - 2.1 派生宏(derive macro) + - 2.2 属性宏(attribute macro) + ## 参考 - [Rust语言圣经](https://github.com/sunface/rust-course) - [Rust 程序设计语言](https://rustwiki.org/zh-CN/book/title-page.html) - [Rust Practice](https://github.com/sunface/rust-by-practice) - [rust-by-example](https://github.com/rust-lang/rust-by-example) +- [Rust 秘典(死灵书)](https://github.com/rust-lang-cn/nomicon-zh-Hans) - [陈天 · Rust 编程第一课](https://time.geekbang.org/column/intro/100085301?tab=catalog) \ No newline at end of file diff --git a/app/Cargo.toml b/app/Cargo.toml index c7e5b00..a7c1f9e 100644 --- a/app/Cargo.toml +++ b/app/Cargo.toml @@ -5,11 +5,5 @@ edition = "2021" [dependencies] serde = { workspace = true } -tracing = { workspace = true } -tracing-subscriber = { workspace = true, features = [ - "env-filter", - "json", - "time", -], optional = true } -chapter01= {path = "../chapter01-log" } -chapter02= {path = "../chapter02-feature",features = ["print-b"],default-features = false} \ No newline at end of file +chapter01 = { path = "../chapter01-log" } +chapter02 = { path = "../chapter02-feature", features = ["print-b"], default-features = false } \ No newline at end of file diff --git a/app/src/main.rs b/app/src/main.rs index 87246a5..d4cdfcd 100644 --- a/app/src/main.rs +++ b/app/src/main.rs @@ -1,13 +1,5 @@ -use chapter01::{add, debug, info, init_config}; use chapter02::print_feature; fn main() { - - let result = add(1,2); - println!("Hello, world! {}",result); print_feature(); - init_config(); - info!("tracing log"); - - } diff --git a/chapter01-log/Cargo.toml b/chapter01-log/Cargo.toml index 563d8a2..a15c57a 100644 --- a/chapter01-log/Cargo.toml +++ b/chapter01-log/Cargo.toml @@ -1,12 +1,15 @@ [package] name = "chapter01" -version = { workspace = true} -edition = { workspace = true} -authors = { workspace = true} +version = { workspace = true } +edition = { workspace = true } +authors = { workspace = true } [dependencies] serde = { workspace = true } tracing = { workspace = true } -tracing-subscriber = { workspace = true } \ No newline at end of file +tracing-subscriber = { workspace = true } + +log = "0.4" +env_logger = "0.9" \ No newline at end of file diff --git a/chapter01-log/examples/log1-env_logger.rs b/chapter01-log/examples/log1-env_logger.rs new file mode 100644 index 0000000..d18409e --- /dev/null +++ b/chapter01-log/examples/log1-env_logger.rs @@ -0,0 +1,16 @@ +use log::{debug, error, info, log_enabled, Level}; + +fn main() { + // 注意,env_logger 必须尽可能早的初始化 + env_logger::init(); + + debug!("this is a debug {}", "message"); + error!("this is printed by default"); + + if log_enabled!(Level::Info) { + let x = 3 * 4; // expensive computation + info!("the answer was: {}", x); + } +} + +// RUST_LOG=info cargo run --color=always --example log1-std --manifest-path ./chapter01-log/Cargo.toml diff --git a/chapter01-log/examples/log2-tracing.rs b/chapter01-log/examples/log2-tracing.rs new file mode 100644 index 0000000..2a01461 --- /dev/null +++ b/chapter01-log/examples/log2-tracing.rs @@ -0,0 +1,7 @@ +use chapter01::init_config; +use log::info; + +fn main() { + init_config(); + info!("tracing log"); +} diff --git a/chapter01-log/log.md b/chapter01-log/log.md index b4b4176..a7ed85c 100644 --- a/chapter01-log/log.md +++ b/chapter01-log/log.md @@ -4,18 +4,115 @@ - [tracing](#tracing) - [tracing 各个模块](#tracing-%E5%90%84%E4%B8%AA%E6%A8%A1%E5%9D%97) + - [log 门面](#log-%E9%97%A8%E9%9D%A2) - -# tracing +# tracing tracing 支持 log 门面库的 API,因此,它既可以作为分布式追踪的 SDK 来使用,也可以作为日志库来使用。 ## tracing 各个模块 -- tracing : 作用域内的结构化日志记录和诊断系统。 -- tracing_appender : 记录事件和跨度的编写者。也就是将日志写入文件或者控制台。 -- tracing_error : 增强错误处理跟踪诊断信息的实用工具。 -- tracing_flame : 用于生成折叠堆栈跟踪以生成Inferno火焰图和火焰图表的跟踪订阅者。 -- tracing_log : 用于连接标准库日志系统和tracing系统的连接器。 -- tracing_subscriber : 用于实现和组成tracing订阅者的工具集合。 \ No newline at end of file + +- tracing: 作用域内的结构化日志记录和诊断系统。 +- tracing_appender: 记录事件和跨度的编写者。也就是将日志写入文件或者控制台。 +- tracing_error: 增强错误处理跟踪诊断信息的实用工具。 +- tracing_flame: 用于生成折叠堆栈跟踪以生成Inferno火焰图和火焰图表的跟踪订阅者。 +- tracing_log: 用于连接标准库日志系统和tracing系统的连接器。 +- tracing_subscriber: 用于实现和组成tracing订阅者的工具集合。 + +## log 门面 + +github.com/rust-lang/log + +```rust +// log-0.4.22/src/lib.rs +pub trait Log: Sync + Send { + // 判断某条带有元数据的日志是否能被记录 + fn enabled(&self, metadata: &Metadata) -> bool; + + // 记录 record 所代表的日志 + fn log(&self, record: &Record); + + // 将缓存中的日志数据刷到输出中,例如标准输出或者文件中 + fn flush(&self); +} +``` + +log 仅仅是日志门面库,它并不具备完整的日志库功能!因此你无法在控制台中看到任何日志输出 + +env_logger 实现 + +```rust +// env_logger-0.9.3/src/lib.rs +impl Log for Logger { + fn enabled(&self, metadata: &Metadata) -> bool { + self.filter.enabled(metadata) + } + + fn log(&self, record: &Record) { + if self.matches(record) { + // Log records are written to a thread-local buffer before being printed + // to the terminal. We clear these buffers afterwards, but they aren't shrinked + // so will always at least have capacity for the largest log record formatted + // on that thread. + // + // If multiple `Logger`s are used by the same threads then the thread-local + // formatter might have different color support. If this is the case the + // formatter and its buffer are discarded and recreated. + + thread_local! { + static FORMATTER: RefCell> = RefCell::new(None); + } + + let print = |formatter: &mut Formatter, record: &Record| { + let _ = + (self.format)(formatter, record).and_then(|_| formatter.print(&self.writer)); + + // Always clear the buffer afterwards + formatter.clear(); + }; + + let printed = FORMATTER + .try_with(|tl_buf| { + match tl_buf.try_borrow_mut() { + // There are no active borrows of the buffer + Ok(mut tl_buf) => match *tl_buf { + // We have a previously set formatter + Some(ref mut formatter) => { + // Check the buffer style. If it's different from the logger's + // style then drop the buffer and recreate it. + if formatter.write_style() != self.writer.write_style() { + *formatter = Formatter::new(&self.writer); + } + + print(formatter, record); + } + // We don't have a previously set formatter + None => { + let mut formatter = Formatter::new(&self.writer); + print(&mut formatter, record); + + *tl_buf = Some(formatter); + } + }, + // There's already an active borrow of the buffer (due to re-entrancy) + Err(_) => { + print(&mut Formatter::new(&self.writer), record); + } + } + }) + .is_ok(); + + if !printed { + // The thread-local storage was not available (because its + // destructor has already run). Create a new single-use + // Formatter on the stack for this call. + print(&mut Formatter::new(&self.writer), record); + } + } + } + + fn flush(&self) {} +} +``` diff --git a/chapter06-type/src/type3-related-trait.rs b/chapter06-type/src/type3-related-trait.rs index 473616e..968c33e 100644 --- a/chapter06-type/src/type3-related-trait.rs +++ b/chapter06-type/src/type3-related-trait.rs @@ -1,6 +1,6 @@ +use regex::Regex; use std::str::FromStr; -use regex::Regex; pub trait Parse { type Error; fn parse(s: &str) -> Result diff --git a/chapter09-hash/hashmap.md b/chapter09-hash/hash.md similarity index 100% rename from chapter09-hash/hashmap.md rename to chapter09-hash/hash.md diff --git a/chapter11-closure/closure.md b/chapter11-closure/closure.md index 9dc7b29..e447c10 100644 --- a/chapter11-closure/closure.md +++ b/chapter11-closure/closure.md @@ -5,7 +5,7 @@ - [闭包](#%E9%97%AD%E5%8C%85) - [案例](#%E6%A1%88%E4%BE%8B) - [Rust 的闭包类型](#rust-%E7%9A%84%E9%97%AD%E5%8C%85%E7%B1%BB%E5%9E%8B) - - [FnOnce 只能被调用一次](#fnonce-%E5%8F%AA%E8%83%BD%E8%A2%AB%E8%B0%83%E7%94%A8%E4%B8%80%E6%AC%A1) + - [FnOnce](#fnonce) - [FnMut](#fnmut) - [Fn](#fn) @@ -40,7 +40,9 @@ where ![img.png](closure-type.png) -### FnOnce 只能被调用一次 +### FnOnce + +FnOnce 只能被调用一次 ```rust #[fundamental] // so that regex can rely that `&str: !FnMut` diff --git a/chapter12-unsafe/unsafe.md b/chapter12-unsafe/unsafe.md index 1078eca..c85aabb 100644 --- a/chapter12-unsafe/unsafe.md +++ b/chapter12-unsafe/unsafe.md @@ -4,6 +4,7 @@ - [unsafe](#unsafe) - [使用 unsafe Rust 的原因](#%E4%BD%BF%E7%94%A8-unsafe-rust-%E7%9A%84%E5%8E%9F%E5%9B%A0) + - [标准库中 unsafe 的函数](#%E6%A0%87%E5%87%86%E5%BA%93%E4%B8%AD-unsafe-%E7%9A%84%E5%87%BD%E6%95%B0) @@ -15,4 +16,13 @@ 指令集)。这样的操作,编译器是无法保证内存安全 - 当 Rust 要访问其它语言比如 C/C++ 的库,因为它们并不满足 Rust 的安全性要求,这种跨语言的 FFI(Foreign Function Interface),也是 unsafe 的 -- 使用 unsafe Rust 纯粹是为了性能。比如略过边界检查、使用未初始化内存等。这样的 unsafe 我们要尽量不用 \ No newline at end of file +- 使用 unsafe Rust 纯粹是为了性能。比如略过边界检查、使用未初始化内存等。这样的 unsafe 我们要尽量不用 + +## 标准库中 unsafe 的函数 + +距离 + +- slice::get_unchecked,它不会检查传入索引的有效性,允许违反内存安全的规则。 +- mem::transmute将一些数据重新解释为给定的类型,绕过类型安全的规则(详见conversions)。 +- 每一个指向一个 Sized 类型的原始指针都有一个offset方法,如果传递的偏移量不在“界内”,则该调用是未定义行为。 +- 所有 FFI(外部函数接口 Foreign Function Interface)函数的调用都是unsafe的,因为 Rust 编译器无法检查其他语言的操作。 \ No newline at end of file diff --git a/chapter13-atomic_n_ordering/Cargo.toml b/chapter13-atomic_n_ordering/Cargo.toml new file mode 100644 index 0000000..24fad51 --- /dev/null +++ b/chapter13-atomic_n_ordering/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "chapter13-ordering" +version.workspace = true +edition.workspace = true +authors.workspace = true + +[[bin]] +name = "ordering1" +path = "src/ordering1.rs" + + +[[bin]] +name = "ordering2" +path = "src/ordering2.rs" diff --git a/chapter13-atomic_n_ordering/ordering.md b/chapter13-atomic_n_ordering/ordering.md new file mode 100644 index 0000000..ee1afe1 --- /dev/null +++ b/chapter13-atomic_n_ordering/ordering.md @@ -0,0 +1,76 @@ + + +**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* + +- [数据访问](#%E6%95%B0%E6%8D%AE%E8%AE%BF%E9%97%AE) +- [指令重排](#%E6%8C%87%E4%BB%A4%E9%87%8D%E6%8E%92) +- [ordering](#ordering) + - [Ordering 的可见性](#ordering-%E7%9A%84%E5%8F%AF%E8%A7%81%E6%80%A7) + + + +## 数据访问 + +假设要实现一个计数功能,每次对变量执行+1的操作。CPU执行的时候就需要顺序执行三个操作 + +1. 从内存中读取变量的值 +2. 加1 +3. 写回到内存中 + +如果有两个线程同时操作了这个值,这三个操作可能是交叉的,导致结果不正确 + +## 指令重排 + +```rust +fn f(a: &mut i32, b: &mut i32) { + *a += 1; + *b += 1; + *a += 1; +} +``` + +交给操作系统编译执行,但很可能你得到的是这样的 + +```rust +fn f(a: &mut i32, b: &mut i32) { + *a += 2; + *b += 1; +} +``` + +**只要不影响程序语义,指令可以重排执行以优化,即不按代码顺序执行。** + +单线程下这样问题可能还不大,但如果多线程下,同一线程下多条原子指令,也是会有指令重排的可能,数据竞争很有可能发生,就是说加了原子操作也无法确定数据操作顺序 + +。 + +## ordering + +Rust用于的内存访问顺序(memory order)的Ordering基本和`C++ 20`的内存排序的保持一致 + +```rust +#[stable(feature = "rust1", since = "1.0.0")] +#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] +#[non_exhaustive] +#[rustc_diagnostic_item = "Ordering"] +pub enum Ordering { + Relaxed, + Release, + Acquire, + AcqRel, + SeqCst, +} +``` + +- Relaxed,这是最宽松的规则,它对编译器和 CPU 不做任何限制,可以乱序执行。 +- Release,适用于写数据操作 + - 当前线程不能有其他的读或写被 reorder 在 store 之后当前写入后的结果对其他线程的同一数据 Acquire 读取操作是可见的 +- Acquire,适用于读取数据操作 + - 当前线程不能有其他的读或写被 reorder 在 load 之前其他线程的同一数据已发生的 Release 写入操作都是对其可见的 +- AcqRel ,是 Acquire 和 Release 的结合 + - 一般用在 fetch_xxx 上,比如你要对一个 atomic 自增 1,你希望这个操作之前和之后的读取或写入操作不会被乱序,并且操作的结果对其它线程可见。 +- SeqCst,除了 AcqRel 的保证外,它还保证所有线程看到的所有 SeqCst 操作的顺序是一致的。 + +### Ordering 的可见性 + +[案例一](./src/ordering1.rs) \ No newline at end of file diff --git a/chapter13-atomic_n_ordering/src/ordering1.rs b/chapter13-atomic_n_ordering/src/ordering1.rs new file mode 100644 index 0000000..a5a2294 --- /dev/null +++ b/chapter13-atomic_n_ordering/src/ordering1.rs @@ -0,0 +1,42 @@ +use std::{ + sync::{ + atomic::{AtomicBool, AtomicU64, Ordering}, + Arc, + }, + thread, +}; + +static S: AtomicU64 = AtomicU64::new(0); +fn relaxed() { + let a = Arc::new(AtomicBool::new(false)); + let b = Arc::new(AtomicBool::new(false)); + let a_clone = a.clone(); + let b_clone = b.clone(); + + let t1 = thread::spawn(move || { + a.store(true, Ordering::Relaxed); + if !b.load(Ordering::Relaxed) { + S.fetch_add(1, Ordering::Relaxed); + } + }); + + let t2 = thread::spawn(move || { + b_clone.store(true, Ordering::Relaxed); + if !a_clone.load(Ordering::Relaxed) { + S.fetch_add(1, Ordering::Relaxed); + } + }); + + t1.join().unwrap(); + t2.join().unwrap(); +} + +fn main() { + let cnt = 100000; + for _ in 0..cnt { + relaxed(); + } + // 结果可能大于10000 + let s = S.load(Ordering::SeqCst); + println!("s: {}", s); +} diff --git a/chapter13-atomic_n_ordering/src/ordering2.rs b/chapter13-atomic_n_ordering/src/ordering2.rs new file mode 100644 index 0000000..951ab0c --- /dev/null +++ b/chapter13-atomic_n_ordering/src/ordering2.rs @@ -0,0 +1,42 @@ +use std::{ + sync::{ + atomic::{AtomicBool, AtomicU64, Ordering}, + Arc, + }, + thread, +}; + +static S: AtomicU64 = AtomicU64::new(0); +fn relaxed() { + let a = Arc::new(AtomicBool::new(false)); + let b = Arc::new(AtomicBool::new(false)); + let a_clone = a.clone(); + let b_clone = b.clone(); + + let t1 = thread::spawn(move || { + a.store(true, Ordering::SeqCst); + if !b.load(Ordering::SeqCst) { + S.fetch_add(1, Ordering::Relaxed); + } + }); + + let t2 = thread::spawn(move || { + b_clone.store(true, Ordering::SeqCst); + if !a_clone.load(Ordering::SeqCst) { + S.fetch_add(1, Ordering::Relaxed); + } + }); + + t1.join().unwrap(); + t2.join().unwrap(); +} + +fn main() { + let cnt = 100000; + for _ in 0..cnt { + relaxed(); + } + // 结果可能大于10000 + let s = S.load(Ordering::SeqCst); + println!("s: {}", s); +} diff --git a/chapter14-concurrecy/Cargo.toml b/chapter14-concurrecy/Cargo.toml new file mode 100644 index 0000000..11cc962 --- /dev/null +++ b/chapter14-concurrecy/Cargo.toml @@ -0,0 +1,58 @@ +[package] +name = "chapter14-concurrecy" +version.workspace = true +edition.workspace = true +authors.workspace = true + +[[bin]] +name = "concurrency1" +path = "src/concurrency1_convar.rs" + +[[bin]] +name = "concurrency2" +path = "src/concurrency2_future.rs" + +[[bin]] +name = "concurrency3" +path = "src/concurrency3_stream.rs" + + +[[bin]] +name = "concurrency4" +path = "src/concurrency4_pin_stack.rs" + +[[bin]] +name = "concurrency5" +path = "src/concurrency5_pin_heap.rs" + +[[bin]] +name = "concurrency6" +path = "src/concurrency6_tokio_main.rs" + +[[bin]] +name = "concurrency7" +path = "src/concurrency7_tokio_mpsc.rs" + + +[[bin]] +name = "concurrency8" +path = "src/concurrency8_tokio_watch.rs" + +[[bin]] +name = "concurrency9" +path = "src/concurrency9_tokio_select.rs" + +[dependencies] +parking_lot = "0.12" +anyhow = "1" +blake3 = "1" +futures = "0.3" +rayon = "1" +serde = { version = "1", features = ["derive"] } +serde_yaml = "0.8" +tokio = { version = "1", features = ["full"] } +tokio-util = { version = "0.6", features = ["codec"] } +toml = "0.5" +tokio-stream = "0.1.15" + + diff --git a/chapter14-concurrecy/concurrency.md b/chapter14-concurrecy/concurrency.md new file mode 100644 index 0000000..9e5a904 --- /dev/null +++ b/chapter14-concurrecy/concurrency.md @@ -0,0 +1,29 @@ + + +**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* + +- [异步运行时](#%E5%BC%82%E6%AD%A5%E8%BF%90%E8%A1%8C%E6%97%B6) + - [executor](#executor) + + + +## 异步运行时 + +- reactor 会利用操作系统提供的异步 I/O,比如 epoll / kqueue / IOCP,来监听操作系统提供的 IO 事件,当遇到满足条件的事件时,就会调用 + Waker.wake() 唤醒被挂起的 Future。这个 Future 会回到 ready queue 等待执行 +- executor 用于调度和执行相应的任务( Future ): tokio 的调度器(executor)会运行在多个线程上,运行线程自己的 ready queue + 上的任务(Future),如果没有,就去别的线程的调度器上“偷”一些过来运行。当某个任务无法再继续取得进展,此时 Future 运行的结果是 + Poll::Pending,那么调度器会挂起任务,并设置好合适的唤醒条件(Waker),等待被 reactor 唤醒。 + +异步编程依赖于两个关键概念:Future 和 async/await + +### executor + +executor 大致想象成一个 Future 的调度器。 + +常见的 executor 有: + +- futures 库自带的很简单的 executor +- tokio 提供的 executor,当使用 #[tokio::main] 时,就隐含引入了 tokio 的 executor; +- async-std 提供的 executor,和 tokio 类似; +- smol 提供的 async-executor,主要提供了 block_on \ No newline at end of file diff --git a/chapter14-concurrecy/src/01_convar.md b/chapter14-concurrecy/src/01_convar.md new file mode 100644 index 0000000..7c2de9b --- /dev/null +++ b/chapter14-concurrecy/src/01_convar.md @@ -0,0 +1,50 @@ + + +**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* + +- [Condvar 条件变量](#condvar-%E6%9D%A1%E4%BB%B6%E5%8F%98%E9%87%8F) + - [使用](#%E4%BD%BF%E7%94%A8) + - [parking_lot的一些关键特点:](#parking_lot%E7%9A%84%E4%B8%80%E4%BA%9B%E5%85%B3%E9%94%AE%E7%89%B9%E7%82%B9) + + + +# Condvar 条件变量 + +condition var 条件变量代表阻止线程的能力,使其在等待事件发生时不消耗CPU时间。 +在其他语言中也有类似的概念,叫做栅栏,闭锁,屏障,信号量等。他们具有相同的意义。 + +在介绍条件变量之前,先介绍屏障(Barrier)。屏障相当于一堵带门的墙,使用wait方法,在某个点阻塞全部进入临界区的线程。条件变量(Condition +Variable)和屏障的语义类似,但它不是阻塞全部线程,而是在满足某些特定条件之前阻塞某一个得到互斥锁的线程 + +## 使用 + +- CondVar需要和锁一起使用,在运行中每个条件变量每次只可以和一个互斥体一起使用。 + +这个接口需要一个 MutexGuard,以便于知道需要唤醒哪个 Mutex 下等待的线程. + +推荐使用 [parking_lot](https://crates.io/crates/parking_lot)的实现。 +parking_lot的设计精髓在于其自适应的锁机制。在无竞争状态下,锁的获取和释放仅需一次原子操作; +微竞争时,会进行几次循环尝试,而不是立即挂起线程;当竞争激烈时,线程会在尝试一段时间后被暂停,避免过度消耗CPU资源。 +此外,该库还支持硬件锁消除,进一步提高了读取密集型任务的性能 + +```rust +// parking_lot-0.12.3/src/condvar.rs +impl Condvar { + #[inline] + pub fn wait(&self, mutex_guard: &mut MutexGuard<'_, T>) { + self.wait_until_internal(unsafe { MutexGuard::mutex(mutex_guard).raw() }, None); + } +} +``` + +### parking_lot的一些关键特点: + +- 超小的存储开销:Mutex和Once只需要1字节,而Condvar和RwLock只占1个机器字。 +- 快速无竞争和快速释放:单次原子操作完成。 +- 微竞争优化:自适应循环尝试。 +- 硬件锁消除:对于具备硬件支持的处理器,提升读性能。 +- 可选的死锁检测:实验性特性,需开启deadlock_detection。 +- 支持序列化(serde):通过启用serde特性。 +- 可发送的锁守卫:通过启用send_guard特性。 +- 平均公平性:避免长时间等待。 +- 递归锁:通过ReentrantMutex类型实现 diff --git a/chapter14-concurrecy/src/02_future.md b/chapter14-concurrecy/src/02_future.md new file mode 100644 index 0000000..091eefb --- /dev/null +++ b/chapter14-concurrecy/src/02_future.md @@ -0,0 +1,217 @@ + + +**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* + +- [future](#future) + - [前置 trait : pin/ unpin](#%E5%89%8D%E7%BD%AE-trait--pin-unpin) + - [future 实现](#future-%E5%AE%9E%E7%8E%B0) + - [waker 的 vtable 在第三方实现](#waker-%E7%9A%84-vtable-%E5%9C%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E5%AE%9E%E7%8E%B0) + - [async 实现](#async-%E5%AE%9E%E7%8E%B0) + - [stream](#stream) + - [futures-core](#futures-core) + + + +# future + +在异步操作里,异步处理完成后的结果,一般用 Promise 来保存,它是一个对象,用来描述在未来的某个时刻才能获得的结果的值 + +在很多支持异步的语言中,Promise 也叫 Future / Delay / Deferred 等。 + +JavaScript Promise 一般存在三个状态; + +1. 初始状态,Promise 还未运行; +2. 等待(pending)状态,Promise 已运行,但还未结束; +3. 结束状态,Promise 成功解析出一个值,或者执行失败。 + +async 定义了一个可以并发执行的任务,而 await 则触发这个任务并发执行。大多数语言中,async/await 是一个语法糖(syntactic +sugar),它使用状态机将 Promise 包装起来,让异步调用的使用感觉和同步调用非常类似,也让代码更容易阅读。 + +async 来方便地生成 Future,await 来触发 Future 的调度和执行。 + +## 前置 trait : pin/ unpin + +unpin: 在内存中安全地移动 + +```rust +// 自引用类型 +struct SelfRef { + value: String, + pointer_to_value: *mut String, +} + +``` + +pointer_to_value 是一个裸指针,指向第一个字段 value 持有的字符串 String 。很简单对吧?现在考虑一个情况, 若String 被移动了怎么办? + +此时一个致命的问题就出现了:新的字符串的内存地址变了,而 pointer_to_value 依然指向之前的地址,一个重大 bug 就出现了! + +实际上,Pin 不按套路出牌,它是一个结构体: + +```rust +#[derive(Copy, Clone)] +pub struct Pin { + #[unstable(feature = "unsafe_pin_internals", issue = "none")] + #[doc(hidden)] + pub __pointer: Ptr, +} +``` + +绝大多数类型都不在意是否被移动(开篇提到的第一种类型),因此它们都自动实现了 Unpin 特征。 + +## future 实现 + +```rust +#[doc(notable_trait)] +#[must_use = "futures do nothing unless you `.await` or poll them"] +#[stable(feature = "futures_api", since = "1.36.0")] +#[lang = "future_trait"] +#[diagnostic::on_unimplemented( + label = "`{Self}` is not a future", + message = "`{Self}` is not a future" +)] +pub trait Future { + /// The type of value produced on completion. + #[stable(feature = "futures_api", since = "1.36.0")] + #[rustc_diagnostic_item = "FutureOutput"] + type Output; + + #[lang = "poll"] + #[stable(feature = "futures_api", since = "1.36.0")] + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll; +} +``` + +poll() 方法,这个方法返回 PollSelf::Output + +```rust +pub enum Poll { + /// Represents that a value is immediately ready. + #[lang = "Ready"] + #[stable(feature = "futures_api", since = "1.36.0")] + Ready(#[stable(feature = "futures_api", since = "1.36.0")] T), + + /// Represents that a value is not ready yet. + /// + /// When a function returns `Pending`, the function *must* also + /// ensure that the current task is scheduled to be awoken when + /// progress can be made. + #[lang = "Pending"] + #[stable(feature = "futures_api", since = "1.36.0")] + Pending, +} +``` + +Poll 是个 enum,包含 Ready 和 Pending 两个状态. + +- 当 Future 返回 Pending 状态时,活还没干完,但干不下去了,需要阻塞一阵子,等某个事件将其唤醒; +- 当 Future 返回 Ready 状态时,Future 对应的值已经得到, + +```rust +#[stable(feature = "futures_api", since = "1.36.0")] +#[lang = "Context"] +pub struct Context<'a> { + waker: &'a Waker, + local_waker: &'a LocalWaker, + // Ensure we future-proof against variance changes by forcing + // the lifetime to be invariant (argument-position lifetimes + // are contravariant while return-position lifetimes are + // covariant). + _marker: PhantomData &'a ()>, + // Ensure `Context` is `!Send` and `!Sync` in order to allow + // for future `!Send` and / or `!Sync` fields. + _marker2: PhantomData<*mut ()>, +} + +#[cfg_attr(not(doc), repr(transparent))] // work around https://github.com/rust-lang/rust/issues/66401 +#[stable(feature = "futures_api", since = "1.36.0")] +pub struct Waker { + waker: RawWaker, +} + +#[derive(PartialEq, Debug)] +#[stable(feature = "futures_api", since = "1.36.0")] +pub struct RawWaker { + /// A data pointer, which can be used to store arbitrary data as required + /// by the executor. This could be e.g. a type-erased pointer to an `Arc` + /// that is associated with the task. + /// The value of this field gets passed to all functions that are part of + /// the vtable as the first parameter. + data: *const (), + /// Virtual function pointer table that customizes the behavior of this waker. + vtable: &'static RawWakerVTable, +} +``` + +Context 就是 Waker 的一个封装。 + +### waker 的 vtable 在第三方实现 + +```rust +// https://github.com/rust-lang/futures-rs/blob/0.3.30/futures-task/src/waker.rs + +pub(super) fn waker_vtable() -> &'static RawWakerVTable { + &RawWakerVTable::new( + clone_arc_raw::, + wake_arc_raw::, + wake_by_ref_arc_raw::, + drop_arc_raw::, + ) +} + +``` + +## async 实现 + +Rust 在编译 async fn 或者 async block 时,就会生成类似的状态机的实现 + +## stream + +对于 Iterator,可以不断调用其 next() 方法,获得新的值,直到 Iterator 返回 None。Iterator 是阻塞式返回数据的,每次调用 next() +,必然独占 CPU 直到得到一个结果. + +异步的 Stream 是非阻塞的,在等待的过程中会空出 CPU 做其他事情。 + +### futures-core + +```rust +// futures-core-0.3.30/src/stream.rs + +#[must_use = "streams do nothing unless polled"] +pub trait Stream { + /// Values yielded by the stream. + type Item; + + fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll>; + + #[inline] + fn size_hint(&self) -> (usize, Option) { + (0, None) + } +} +``` + +poll_next() 调用起来不方便,我们需要自己处理 Poll 状态, +所以StreamExt 提供了 next() 方法,返回一个实现了 Future trait 的 Next 结构 + +```rust +pub trait StreamExt: Stream { + fn next(&mut self) -> Next<'_, Self> + where + Self: Unpin, + { + assert_future::, _>(Next::new(self)) + } + + fn into_future(self) -> StreamFuture + where + Self: Sized + Unpin, + { + assert_future::<(Option, Self), _>(StreamFuture::new(self)) + } + + + // ... + +} +``` diff --git a/chapter14-concurrecy/src/03_tokio.md b/chapter14-concurrecy/src/03_tokio.md new file mode 100644 index 0000000..b0fc173 --- /dev/null +++ b/chapter14-concurrecy/src/03_tokio.md @@ -0,0 +1,123 @@ + + +**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* + +- [tokio](#tokio) + - [Tokio 的任务调度](#tokio-%E7%9A%84%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6) + - [Tokio Reactor 模型](#tokio-reactor-%E6%A8%A1%E5%9E%8B) + - [Tokio 的消息通道( channel )](#tokio-%E7%9A%84%E6%B6%88%E6%81%AF%E9%80%9A%E9%81%93-channel-) + - [watch channel](#watch-channel) + - [tokio::select!](#tokioselect) + - [常见使用错误](#%E5%B8%B8%E8%A7%81%E4%BD%BF%E7%94%A8%E9%94%99%E8%AF%AF) + - [std::sync::Mutex 和 tokio::sync::Mutex](#stdsyncmutex-%E5%92%8C-tokiosyncmutex) + - [源码](#%E6%BA%90%E7%A0%81) + - [task 抽象](#task-%E6%8A%BD%E8%B1%A1) + - [参考](#%E5%8F%82%E8%80%83) + + + +# tokio + +Tokio 的核心是一套 M:N 的协程 Runtime,下层通过 Rust 协程和 Mio 驱动,支撑上层的 HTTP / RPC 应用。 + +主要由以下组件构成: + +- 多线程版本的异步运行时,可以运行使用 async/await 编写的代码 +- 标准库中阻塞 API 的异步版本,例如thread::sleep会阻塞当前线程,tokio中就提供了相应的异步实现版本 +- 构建异步编程所需的生态,甚至还提供了 tracing 用于日志和分布式追踪, 提供 console 用于 Debug 异步编程 + +![img.png](tokio_and_run_queue.png) + +## Tokio 的任务调度 + +![img.png](runtime-scheduler.png) + +Local Run Queue、 LIFO Slot、 Global Queue 都用于存储待处理的任务。Tokio Runtime 可以包含多个 Processor, +每个 Processor 都有自己的 Local Run Queue(Local Run Queue 的大小是固定的)和 LIFO Slot(目前 LIFO Slot 只能存放一个任务),所有的 +Processor 共享 Global Queue。 + +Processor 获取 task 后,会开始执行这个 task,在 task 执行过程中,可能会产生很多新的 task,第一个新 task 会被放到 LIFO Slot +中,其他新 task 会被放到 Local Run Queue 中,因为 Local Run Queue 的大小是固定的,如果它满了,剩余的 task 会被放到 Global +Queue 中。 + +Processor 运行完当前 task 后,会尝试按照以下顺序获取新的 task 并继续运行: + +1. LIFO Slot. +2. Local Run Queue. +3. Global Queue. +4. 其他 Processor 的 Local Run Queue。 + +## Tokio Reactor 模型 + +![img.png](reactor.png) + +一个异步任务的处理过程为: + +1. Processor 从 Task Queue 中获取一个 Task。 +2. Processor 判断这个 Task 为异步任务(Task.future.poll()返回 Pending),则将 Task 封装为 Waker,交给多路复用器。 +3. 多路复用器监听系统事件。 +4. 当事件出现时,多路复用器将事件和该事件对应的 Waker 交给事件队列。 +5. 事件循环处理事件,调用 Waker.wake(), 将 Task 重新放入 TaskQueue 中,待 Processor 处理 + +## Tokio 的消息通道( channel ) + +* mpsc, 多生产者,单消费者模式 +* oneshot, 单生产者,单消费者,一次只能发送一条消息。一旦发送,channel就会关闭 +* broadcast,多生产者,多消费者,其中每一条发送的消息都可以被所有接收者收到,因此是广播 +* watch,单生产者,多消费者,只保存一条最新的消息,因此接收者只能看到最近的一条消息,例如,这种模式适用于配置文件变化的监听 + +少了一种类型:多生产者、多消费者,且每一条消息只能被其中一个消费者接收,如果有这种需求,可以使用 async-channel 包 + +### watch channel + +watch channel 是一种可以发送多次消息的 channel。它的特点是可以有多个接收端,每个接收端都可以接收到发送端发送的最新消息。 + +watch channel 适用于以下场景: + +- 线程之间需要传递多次消息。 +- 线程之间需要订阅最新消息 + +### tokio::select! + +tokio::select! 宏允许我们等待多个异步的任务,并在其中一个完成时返回。 + +select! 最多可以支持 64 个分支. + +```shell +# 每个分支形式 +<模式> = => <结果处理>, +``` + +## 常见使用错误 + +### std::sync::Mutex 和 tokio::sync::Mutex + +一个常见的错误无条件地使用 tokio::sync::Mutex ,而真相是:Tokio 提供的异步锁只应该在跨多个 .await调用时使用,而且 Tokio 的 +Mutex 实际上内部使用的也是 std::sync::Mutex。 + +Tokio 提供的锁最大的优点就是:它可以在 .await 执行期间被持有,而且不会有任何问题。但是代价就是,这种异步锁的性能开销会更高 + +锁的使用有以下经验之谈: + +- 锁如果在多个 .await 过程中持有,应该使用 Tokio 提供的锁,原因是 + .await的过程中锁可能在线程间转移,若使用标准库的同步锁存在死锁的可能性,例如某个任务刚获取完锁,还没使用完就因为 .await + 让出了当前线程的所有权,结果下个任务又去获取了锁,造成死锁 +- 锁竞争不多的情况下,使用 std::sync::Mutex +- 锁竞争多,可以考虑使用三方库提供的性能更高的锁,例如 parking_lot::Mutex + +## 源码 + +### task 抽象 + +任务状态 + +```rust +// tokio-1.40.0/src/runtime/task/state.rs +pub(super) struct State { + val: AtomicUsize, +} +``` + +## 参考 + +- [探索 Tokio Runtime](https://juejin.cn/post/7307097620846837812) \ No newline at end of file diff --git a/chapter14-concurrecy/src/concurrency1_convar.rs b/chapter14-concurrecy/src/concurrency1_convar.rs new file mode 100644 index 0000000..0e23b04 --- /dev/null +++ b/chapter14-concurrecy/src/concurrency1_convar.rs @@ -0,0 +1,56 @@ +mod concurrency2_future; + +use parking_lot::{Condvar, Mutex}; +use std::sync::Arc; +use std::thread; +use std::thread::sleep; +use std::time::Duration; + +// 我们启动三个线程,t1,t2,t3。分别执行任务T1,T2,T3。现在要求:T2必须等待T1和T3完成之后再执行 +pub fn main() { + let pair = Arc::new((Mutex::new(0), Condvar::new())); + let pair2 = pair.clone(); + let pair3 = pair.clone(); + + let t1 = thread::Builder::new() + .name("T1".to_string()) + .spawn(move || { + sleep(Duration::from_secs(4)); + println!("I'm working in T1, step 1"); + let &(ref lock, ref cvar) = &*pair2; + let mut started = lock.lock(); + *started += 2; + cvar.notify_one(); + }) + .unwrap(); + + let t2 = thread::Builder::new() + .name("T2".to_string()) + .spawn(move || { + println!("I'm working in T2, start"); + let &(ref lock, ref cvar) = &*pair; + let mut notify = lock.lock(); + + while *notify < 5 { + cvar.wait(&mut notify); + } + println!("I'm working in T2, final"); + }) + .unwrap(); + + let t3 = thread::Builder::new() + .name("T3".to_string()) + .spawn(move || { + sleep(Duration::from_secs(3)); + println!("I'm working in T3, step 2"); + let &(ref lock, ref cvar) = &*pair3; + let mut started = lock.lock(); + *started += 3; + cvar.notify_one(); + }) + .unwrap(); + + t1.join().unwrap(); + t2.join().unwrap(); + t3.join().unwrap(); +} diff --git a/chapter14-concurrecy/src/concurrency2_future.rs b/chapter14-concurrecy/src/concurrency2_future.rs new file mode 100644 index 0000000..71cec65 --- /dev/null +++ b/chapter14-concurrecy/src/concurrency2_future.rs @@ -0,0 +1,28 @@ +use futures::executor::block_on; +use std::future::Future; + +#[tokio::main] +async fn main() { + let name1 = "Danny".to_string(); + let name2 = "Joy".to_string(); + + say_hello1(&name1).await; + say_hello2(&name2).await; + + // Future 除了可以用 await 来执行外,还可以直接用 executor 执行 + block_on(say_hello1(&name1)); + block_on(say_hello2(&name2)); +} + +async fn say_hello1(name: &str) -> usize { + println!("Hello {}", name); + 42 +} + +// async fn 关键字相当于一个返回 impl Future 的语法糖 +fn say_hello2<'fut>(name: &'fut str) -> impl Future + 'fut { + async move { + println!("Hello {}", name); + 42 + } +} diff --git a/chapter14-concurrecy/src/concurrency3_stream.rs b/chapter14-concurrecy/src/concurrency3_stream.rs new file mode 100644 index 0000000..37808b4 --- /dev/null +++ b/chapter14-concurrecy/src/concurrency3_stream.rs @@ -0,0 +1,10 @@ +use tokio_stream::StreamExt; + +#[tokio::main] +async fn main() { + let mut stream = tokio_stream::iter(&[1, 2, 3]); + + while let Some(v) = stream.next().await { + println!("GOT = {:?}", v); + } +} diff --git a/chapter14-concurrecy/src/concurrency4_pin_stack.rs b/chapter14-concurrecy/src/concurrency4_pin_stack.rs new file mode 100644 index 0000000..f0186a0 --- /dev/null +++ b/chapter14-concurrecy/src/concurrency4_pin_stack.rs @@ -0,0 +1,61 @@ +use std::marker::PhantomPinned; +use std::pin::Pin; + +#[derive(Debug)] +struct Test { + a: String, + b: *const String, + _marker: PhantomPinned, +} + +impl Test { + fn new(txt: &str) -> Self { + Test { + a: String::from(txt), + b: std::ptr::null(), + _marker: PhantomPinned, // 这个标记可以让我们的类型自动实现特征`!Unpin` + } + } + + fn init(self: Pin<&mut Self>) { + let self_ptr: *const String = &self.a; + let this = unsafe { self.get_unchecked_mut() }; // 一旦类型实现了 !Unpin ,那将它的值固定到栈( stack )上就是不安全的行为,因此在代码中我们使用了 unsafe 语句块来进行处理 + this.b = self_ptr; + } + + fn a(self: Pin<&Self>) -> &str { + &self.get_ref().a + } + + fn b(self: Pin<&Self>) -> &String { + assert!( + !self.b.is_null(), + "Test::b called without Test::init being called first" + ); + unsafe { &*(self.b) } + } +} + +pub fn main() { + // 此时的`test1`可以被安全的移动 + let mut test1 = Test::new("test1"); + // 新的`test1`由于使用了`Pin`,因此无法再被移动,这里的声明会将之前的`test1`遮蔽掉(shadow) + let mut test1 = unsafe { Pin::new_unchecked(&mut test1) }; + Test::init(test1.as_mut()); + + let mut test2 = Test::new("test2"); + let mut test2 = unsafe { Pin::new_unchecked(&mut test2) }; + Test::init(test2.as_mut()); + + println!( + "a: {}, b: {}", + Test::a(test1.as_ref()), + Test::b(test1.as_ref()) + ); + std::mem::swap(test1.get_mut(), test2.get_mut()); + println!( + "a: {}, b: {}", + Test::a(test2.as_ref()), + Test::b(test2.as_ref()) + ); +} diff --git a/chapter14-concurrecy/src/concurrency5_pin_heap.rs b/chapter14-concurrecy/src/concurrency5_pin_heap.rs new file mode 100644 index 0000000..046a8f9 --- /dev/null +++ b/chapter14-concurrecy/src/concurrency5_pin_heap.rs @@ -0,0 +1,40 @@ +use std::marker::PhantomPinned; +use std::pin::Pin; + +#[derive(Debug)] +struct Test { + a: String, + b: *const String, + _marker: PhantomPinned, +} + +impl Test { + fn new(txt: &str) -> Pin> { + let t = Test { + a: String::from(txt), + b: std::ptr::null(), + _marker: PhantomPinned, + }; + let mut boxed = Box::pin(t); + let self_ptr: *const String = &boxed.as_ref().a; + unsafe { boxed.as_mut().get_unchecked_mut().b = self_ptr }; + + boxed + } + + fn a(self: Pin<&Self>) -> &str { + &self.get_ref().a + } + + fn b(self: Pin<&Self>) -> &String { + unsafe { &*(self.b) } + } +} + +pub fn main() { + let test1 = Test::new("test1"); + let test2 = Test::new("test2"); + + println!("a: {}, b: {}", test1.as_ref().a(), test1.as_ref().b()); + println!("a: {}, b: {}", test2.as_ref().a(), test2.as_ref().b()); +} diff --git a/chapter14-concurrecy/src/concurrency6_tokio_main.rs b/chapter14-concurrecy/src/concurrency6_tokio_main.rs new file mode 100644 index 0000000..3daf90a --- /dev/null +++ b/chapter14-concurrecy/src/concurrency6_tokio_main.rs @@ -0,0 +1,15 @@ +#[tokio::main] +async fn main() { + println!("hello"); +} +/* +fn main() { + tokio::runtime::Builder::new_multi_thread().enable_all() + .build().unwrap() + .block_on(async { + // async main + println!("hello"); + }) +} + +*/ diff --git a/chapter14-concurrecy/src/concurrency7_tokio_mpsc.rs b/chapter14-concurrecy/src/concurrency7_tokio_mpsc.rs new file mode 100644 index 0000000..cdaaf0e --- /dev/null +++ b/chapter14-concurrecy/src/concurrency7_tokio_mpsc.rs @@ -0,0 +1,20 @@ +use tokio::sync::mpsc; + +#[tokio::main] +async fn main() { + // mpsc 多生产者,单消费者模式 + let (sx, mut rx) = mpsc::channel(32); + let sx2 = sx.clone(); + + tokio::spawn(async move { + sx.send("sending from first handle").await; + }); + + tokio::spawn(async move { + sx2.send("sending from second handle").await; + }); + + while let Some(message) = rx.recv().await { + println!("GOT = {}", message); + } +} diff --git a/chapter14-concurrecy/src/concurrency8_tokio_watch.rs b/chapter14-concurrecy/src/concurrency8_tokio_watch.rs new file mode 100644 index 0000000..7c7b376 --- /dev/null +++ b/chapter14-concurrecy/src/concurrency8_tokio_watch.rs @@ -0,0 +1,28 @@ +use tokio::sync::watch; +use tokio::time::{sleep, Duration}; + +#[tokio::main] +async fn main() { + // watch 单一生产者、多消费者的通道,只保留最后发送的值 + let (tx, mut rx) = watch::channel("hello"); + let mut rx2 = rx.clone(); + + tokio::spawn(async move { + while rx.changed().await.is_ok() { + println!("received1 = {:?}", *rx.borrow()); + } + }); + + tokio::spawn(async move { + while rx2.changed().await.is_ok() { + println!("received2 = {:?}", *rx2.borrow()); + } + }); + + tx.send("first").expect("send error!"); + sleep(Duration::from_millis(3000)).await; + tx.send("second").expect("send error!"); + tx.send("third").expect("send error!"); + + sleep(Duration::from_millis(3000)).await; +} diff --git a/chapter14-concurrecy/src/concurrency9_tokio_select.rs b/chapter14-concurrecy/src/concurrency9_tokio_select.rs new file mode 100644 index 0000000..f681cb5 --- /dev/null +++ b/chapter14-concurrecy/src/concurrency9_tokio_select.rs @@ -0,0 +1,24 @@ +use tokio::sync::oneshot; + +#[tokio::main] +async fn main() { + let (tx1, rx1) = oneshot::channel(); + let (tx2, rx2) = oneshot::channel(); + + tokio::spawn(async move { + let _ = tx1.send("one"); + }); + + tokio::spawn(async move { + let _ = tx2.send("two"); + }); + + tokio::select! {// select! 语句在两个channels上等待,并将va1绑定到任务返回的值上. 当其中任一 tx1 或者 tx2 完成时,与之相关的块就会执行. + val = rx1 => { + println!("rx1 completed first with {:?}", val); + } + val = rx2 => { + println!("rx2 completed first with {:?}", val); + } + } +} diff --git a/chapter14-concurrecy/src/reactor.png b/chapter14-concurrecy/src/reactor.png new file mode 100644 index 0000000000000000000000000000000000000000..6812765b339713de42d8258aa2dce90cfdbcf300 GIT binary patch literal 96594 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�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

e*1dqpYa7*WS^zDuhNS(~45wKQT9ns||AI?j1 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 literal 0 HcmV?d00001 diff --git a/chapter14-concurrecy/src/runtime-scheduler.png b/chapter14-concurrecy/src/runtime-scheduler.png new file mode 100644 index 0000000000000000000000000000000000000000..4ed49f783f3eeeb45813be9a7b1eaafbe5702710 GIT binary patch literal 41726 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 BOPwmijF5Su@(egG)xH3+pB zc%BDXc)$sOCqI>IBHbleUt3HclM&-dXDh|TmimQXJ`bFh-*8Ip5JV@-B~d>pB5#+? ztN;x@S;q2nyWu$ZZnwxzM{wwReWgHyvE08i^+eG9^K)O`nch`(<+2ck!;q`VEW5vbGo)lC`YNLJ3_Ac)XR8;G5<{%_UWKK1@E+ zs}5<5xS_qZ@a3jWZZUL%{)E^de^5QefMlJ=MKLY|hsg)j{9-D>f3NTt;M9vJ6olbPc?JSSBWW|{NB`!+c_e$g_09T^o>`6!& z)&D=}5vq?}dKTUg=Wq-3_%Oa3RB}19+{I+^h+zsWiY$fUMt%jRH}XLvD$$L<2Eud4 zqcWapKv*SP`ziWvQ>wcbXe22IgFdLbL>0IP`M>X=Vy`hX{jJIzC&3>GvvZ5(X-tXe z)fZPru@F>H=g+n0`R}1(L={3lWZ3|Q7RB%tc~}7|P(+>3Af@!QE4>Gh^ry?$p2sg! zN!$(jV!xjcyay;7^Oa$`sPTIYKB0riz~nHRxtUq4E59z_AuV2RQ0ao|^Wceu0w*2= zi1>9N^LVuC1S)OJnh8uM>|XokZ3S;@l0@5D2GDE&;B{&Nj_?Ios~xnHJnTc@|2sc; zpT6E7N=k67i?CZGhu07{`IJ6}(MbZXfaR{8qMtyn>(unL9l=++jCajMHXH1t2vyg= zU7dIV{H18&li5r;-AGH^@9C`MmuKm)bKgusQBl2O3{X>YL+W-@2Fd|tdASj3P9*q} zR%D%^q^=YjHDH?s^ z1)&`{N}fTSBaksyRW6n|3!>5Jhdx>t<^!FwL326s-$DAyrC2Tgq{Rk%#OsGsLO7a) zDtz*v-}79m8kGGM0Sgwo+_h%qolsQoslX_b@Y*D6U%BO#=23gR${z3`7?|l7;~hi) E16E6;YybcN literal 0 HcmV?d00001 diff --git a/chapter14-concurrecy/src/tokio_and_run_queue.png b/chapter14-concurrecy/src/tokio_and_run_queue.png new file mode 100644 index 0000000000000000000000000000000000000000..8842d2e1158715149656895cfd37f2aeea4620d3 GIT binary patch literal 132254 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 auH?BV_xR~a>F(RxcXW(ymfo;`@;?B*>rTc1 literal 0 HcmV?d00001 diff --git a/chapter15-macro/Cargo.toml b/chapter15-macro/Cargo.toml new file mode 100644 index 0000000..9a7834a --- /dev/null +++ b/chapter15-macro/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "chapter15-macro" +version.workspace = true +edition.workspace = true +authors.workspace = true + +[lib] +# 链接 rustc 工具链提供的 proc-macro 库 libproc_macro, 同时也表明该 crate 是 proc macro 类型 +proc-macro = true + + +[dependencies] +anyhow = "1" +askama = "0.11" # 处理 jinjia 模板,模板需要放在和 src 平行的 templates 目录下 +darling = "0.13" # 可以很方便的处理宏里面 attributes +proc-macro2 = "1" # proc-macro 的封装 +quote = "1.0" # 提供 quote!{} 宏来生成代码(如实现 trait) +syn = { version = "1", features = ["extra-traits"] } # 解析 TokenStream 来生成语法树 AST ,使用 extra-traits 可以用于 Debug + + + + + + +[[example]] +name = "macro1" +path = "examples/macro1-declarativemacro.rs" + + +[[example]] +name = "macro2" +path = "examples/macro2-declarativemacro-hygiene.rs" + + +[[example]] +name = "macro3" +path = "examples/macro3-derive-macro.rs" + + +[[example]] +name = "macro4" +path = "examples/macro4-attribute-macro.rs" \ No newline at end of file diff --git a/chapter15-macro/examples/macro1-declarativemacro.rs b/chapter15-macro/examples/macro1-declarativemacro.rs new file mode 100644 index 0000000..4b6bccc --- /dev/null +++ b/chapter15-macro/examples/macro1-declarativemacro.rs @@ -0,0 +1,48 @@ +#[macro_export] +macro_rules! my_vec { + // 匹配 my_vec![] + () => { + std::vec::Vec::new() + }; + // 匹配 my_vec![1,2,3] + ($($el:expr), *) => { + // 这段代码需要用{}包裹起来,因为宏需要展开,这样能保证作用域正常,不影响外部。这也是rust的宏是 Hygienic Macros 的体现。 + // 而 C/C++ 的宏不强制要求,但是如果遇到代码片段,在 C/C++ 中也应该使用{}包裹起来。 + { + let mut v = std::vec::Vec::new(); + $(v.push($el);)* // 由于匹配的时候匹配到一个 $(...)* (我们可以不管分隔符),在执行的代码块中,我们也要相应地使用 $(...)* 展开。所以这句 $(v.push($el);)* 相当于匹配出多少个 $el就展开多少句 push 语句。 + v + } + }; + // 匹配 my_vec![1; 3] + ($el:expr; $n:expr) => { + std::vec::from_elem($el, $n) + }; +} + +fn main() { + println!("{:?}", my_vec![1, 2, 3]); +} + +/* +✗ cargo expand --package chapter15-macro --example macro1 + + +#![feature(prelude_import)] +#[prelude_import] +use std::prelude::rust_2021::*; +#[macro_use] +extern crate std; +use chapter15_macro::my_vec; +fn main() { + { + ::std::io::_print( + format_args!( + "{0:?}\n", + { + let mut v = std::vec::Vec::new(); + v.push(1); + v.push(2); + v.push(3); + + */ diff --git a/chapter15-macro/examples/macro2-declarativemacro-hygiene.rs b/chapter15-macro/examples/macro2-declarativemacro-hygiene.rs new file mode 100644 index 0000000..c8f4b22 --- /dev/null +++ b/chapter15-macro/examples/macro2-declarativemacro-hygiene.rs @@ -0,0 +1,39 @@ +#[macro_export] +macro_rules! make_local { + () => { + let local = 0; + }; +} + +fn main() { + let local = 42; + make_local!(); + assert_eq!(local, 42); +} + +/* +✗ cargo expand --package chapter15-macro --example macro2 + + +#![feature(prelude_import)] +#[prelude_import] +use std::prelude::rust_2021::*; +#[macro_use] +extern crate std; +fn main() { + let local = 42; + let local = 0; + match (&local, &42) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + */ diff --git a/chapter15-macro/examples/macro3-derive-macro.rs b/chapter15-macro/examples/macro3-derive-macro.rs new file mode 100644 index 0000000..b77a40d --- /dev/null +++ b/chapter15-macro/examples/macro3-derive-macro.rs @@ -0,0 +1,30 @@ +use chapter15_macro::Builder; + +#[allow(dead_code)] +#[derive(Debug, Builder)] +pub struct Command { + executable: String, + args: Vec, + env: Vec, + current_dir: Option, +} + +fn main() { + let command = Command::builder() + .executable("cargo".to_owned()) + .args(vec!["build".to_owned(), "--release".to_owned()]) + .env(vec![]) + .build() + .unwrap(); + assert!(command.current_dir.is_none()); + + let command = Command::builder() + .executable("cargo".to_owned()) + .args(vec!["build".to_owned(), "--release".to_owned()]) + .env(vec![]) + .current_dir("..".to_owned()) + .build() + .unwrap(); + assert!(command.current_dir.is_some()); + println!("{:?}", command); +} diff --git a/chapter15-macro/examples/macro4-attribute-macro.rs b/chapter15-macro/examples/macro4-attribute-macro.rs new file mode 100644 index 0000000..59b3ee4 --- /dev/null +++ b/chapter15-macro/examples/macro4-attribute-macro.rs @@ -0,0 +1,16 @@ +use core::time; +use std::thread; + +use chapter15_macro::log_bench; + +#[log_bench] +fn test_my_macro() { + for num in 0..3 { + thread::sleep(time::Duration::from_secs(1)); + println!("{}", num); + } +} + +fn main() { + test_my_macro(); +} diff --git a/chapter15-macro/macro.md b/chapter15-macro/macro.md new file mode 100644 index 0000000..06a1de1 --- /dev/null +++ b/chapter15-macro/macro.md @@ -0,0 +1,315 @@ + + +**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* + +- [macro 宏](#macro-%E5%AE%8F) + - [声明宏(declarative macro)](#%E5%A3%B0%E6%98%8E%E5%AE%8Fdeclarative-macro) + - [声明宏的卫生性 hygiene](#%E5%A3%B0%E6%98%8E%E5%AE%8F%E7%9A%84%E5%8D%AB%E7%94%9F%E6%80%A7-hygiene) + - [过程宏(procedural macro)](#%E8%BF%87%E7%A8%8B%E5%AE%8Fprocedural-macro) + - [派生宏(derive macro 可推导宏)](#%E6%B4%BE%E7%94%9F%E5%AE%8Fderive-macro-%E5%8F%AF%E6%8E%A8%E5%AF%BC%E5%AE%8F) + - [属性宏(attribute macro)](#%E5%B1%9E%E6%80%A7%E5%AE%8Fattribute-macro) + - [第三方实现 --> #[tokio::main]](#%E7%AC%AC%E4%B8%89%E6%96%B9%E5%AE%9E%E7%8E%B0----tokiomain) + - [函数宏(function-like macro)](#%E5%87%BD%E6%95%B0%E5%AE%8Ffunction-like-macro) + - [其他编程语言常见的元编程方式](#%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80%E5%B8%B8%E8%A7%81%E7%9A%84%E5%85%83%E7%BC%96%E7%A8%8B%E6%96%B9%E5%BC%8F) + - [工具](#%E5%B7%A5%E5%85%B7) + - [cargo-expand](#cargo-expand) + - [syn](#syn) + - [quote](#quote) + - [参考](#%E5%8F%82%E8%80%83) + + + +# macro 宏 + +元编程可以让开发者将原生语言写的代码作为数据输入,经过自定义的逻辑,重新输出为新的代码并作为整体代码的一部分。这个过程一般在编译时期完成(对于编译型语言来说),所以让人觉得这是一种神奇的 +“黑魔法 + +宏就两大类:对代码模板做简单替换的声明宏(declarative macro)、可以深度定制和生成代码的过程宏(procedural macro)。 + +宏调用有三种等价的形式:marco!(xx), marcro![xxx], macro!{xx}。惯例是: + +- 函数传参调用场景使用 () 形式,如 println!(); +- 字面量初始化使用 [] 形式,如 vec![0; 4]; + +## 声明宏(declarative macro) + +声明宏可以用 macro_rules! 来描述,比如像 vec![]、println!、以及 info!,它们都是声明宏。 + +声明式宏类似于 match 匹配。它可以将表达式的结果与多个模式进行匹配。一旦匹配成功,那么该模式相关联的代码将被展开。和 match +不同的是,宏里的值是一段 rust 源代码。所有这些都发生在编译期,并没有运行期的性能损耗 + +```rust +#[cfg(all(not(no_global_oom_handling), not(test)))] +#[macro_export] +#[stable(feature = "rust1", since = "1.0.0")] +#[rustc_diagnostic_item = "vec_macro"] +#[allow_internal_unstable(rustc_attrs, liballoc_internals)] +macro_rules! vec { + () => ( + $crate::__rust_force_expr!($crate::vec::Vec::new()) + ); + // 匹配到以 ; 分隔的两个表达式,; 左边的表达式的值将被捕获匹配到 $elem,; 右边的表达式的值将被捕获匹配到 $n + ($elem:expr; $n:expr) => ( + $crate::__rust_force_expr!($crate::vec::from_elem($elem, $n)) + ); + ($($x:expr),+ $(,)?) => ( + $crate::__rust_force_expr!(<[_]>::into_vec( + // This rustc_box is not required, but it produces a dramatic improvement in compile + // time when constructing arrays with many elements. + #[rustc_box] + $crate::boxed::Box::new([$($x),+]) + )) + ); +} +``` + +- $crate 是一个特殊的元变量,用来指代当前 crate +- 条件捕获的参数使用 $ 开头的标识符来声明 +- #[macro_export]标签是用来声明:只要 use 了这个crate,就可以使用该宏。同时包含被 export 出的宏的模块,在声明时必须放在前面,否则靠前的模块里找不到这些宏 + +macro_rules! 的基本结构 + +```shell +macro_rules! $ name { + $ rule0; + $ rule1; + //... + $ ruleN; +} +``` + +每一条 rule 其实就是模式匹配和代码扩展生成: + +```shell +( $matcher ) => { $expansion }; +``` + +类似 vec![0; 10] 的功能时,0; 10 ,其中 ; 左边是元素初始值 0,; 右边是个数 10。那么匹配似乎可以为: + +```shell +($elem ; $n) => { ... } +``` + +描述是不精确的,我们还需要加上捕获方式,即捕获的是一个表达式 + +```shell +($elem:expr ; $n:expr) => { ... } +``` + +```rust +let v = vec![1, 2, 3]; +``` + +先看 $matcher 部分,即 1, 2, 3。像这种需要匹配一系列 token 的模式,我们需要使用宏里的重复匹配模式。比如要想匹配 1,2,3,可以写成: + +```rust +( $ ( $ elem:expr ), * ) => { ... } +``` + +即 $(...),* 模式,而 (...) 则是和上节中变量捕获的方式是一样的,即 $elem:expr。, 表示为分隔符,* 表示匹配 0 或者多次. + +为参数明确类型,哪些类型可用也整理在这里了: + +- item,比如一个函数、结构体、模块等。 +- block,代码块。比如一系列由花括号包裹的表达式和语句。 +- stmt,语句。比如一个赋值语句。 +- pat,模式。 +- expr,表达式。刚才的例子使用过了。ty,类型。比如 Vec。 +- ident,标识符。比如一个变量名。path,路径。比如:foo、::std::mem::replace、transmute::<_, int>。meta,元数据。一般是在 #[...] + 和 #![...] 属性内部的数据。 +- tt,单个的 token 树(一个独立的 token 或一系列在匹配完整的定界符 ()、[] 或 {} 中的 token)。 +- vis,可能为空的一个 Visibility 修饰符。比如 pub、pub(crate) + +### 声明宏的卫生性 hygiene + +宏的卫生性,其实说的就是宏在上下文工作不影响或不受周围环境的影响。或者换句话来说,就是宏的调用是没有 side effect。对于 +macro_rules!, +它是部分卫生的(partially hygienic)。我们目前阶段可以不用太关注 macro_rules! 在哪些场景是 “不卫生” 的,而是了解一下 +macro_rules! 是如何在大多数场景做到 “卫生” 的 + +```rust +#![feature(prelude_import)] +#[prelude_import] +use std::prelude::rust_2021::*; +#[macro_use] +extern crate std; +use chapter15_macro::make_local; +fn main() { + let local = 42; + let local = 0; + match (&local, &42) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; +} +``` + +Rust 看来,macro_rules 中的 local 和 main() 里的 local 分别有着不同的颜色,所以不会将其混淆 + +## 过程宏(procedural macro) + +过程宏分为三种: + +- 函数宏(function-like macro):custom!(…) 看起来像函数的宏,但在编译期进行处理。比如 sqlx 里的 query 宏,它内部展开出一个 + expand_query + 函数宏。你可能想象不到,看上去一个简单的 query 处理,内部有多么庞大的代码结构。 +- 属性宏(attribute macro):#[CustomAttribute]可以在其他代码块上添加属性,为代码块提供更多功能。比如 rocket 的 get / put + 等路由属性,#[tokio::main] 来引入 runtime。 +- 派生宏(derive macro 可推导宏):为 derive 属性添加新的功能,一般用来为 struct/enum/union 实现特定的 + trait。这是我们平时使用最多的宏,比如 #[derive(Debug)] 为我们的数据结构提供 + Debug trait + 的实现、#[derive(Serialize, Deserialize)]为我们的数据结构提供 serde 相关 trait 的实现 + +它更像函数,他接受一些代码作为参数输入,然后对他们进行加工,生成新的代码,他不是在做声明式宏那样的模式匹配 + +不能在原始的crate中直接写过程式宏,需要把过程式宏放到一个单独的crate中(以后可能会消除这种约定)。定义过程式宏的方法如下 + +```rust +use proc_macro; + +#[some_attribute] +pub fn some_name(input: TokenStream) -> TokenStream {} + +``` + +在单独的 crate package 中定义过程宏的原因: + +proc macro 定义需要先被编译器编译为 host 架构类型,后续编译使用它的代码时,编译器才能 dlopen 和执行它们来为 target 架构生成代码; +非过程宏 crate 需要被边翼卫 target 架构类型,然后才能被和其它 target 架构的动态库链接; + +需要引入proc_macro 这个 crate,然后标签是用来声明它是哪种过程式宏的,接着就是一个函数定义,函数接受 TokenStream,返回 +TokenStream。TokenStream 类型就定义在 proc_macro 包中,表示 token 序列。 + +除了标准库 proc_macro 中的这个包,还可以使用proc_macro2 包,使用 proc_macro2::TokenStream::from() 和 proc_macro:: +TokenStream::from() +可以很便捷地在两个包的类型间进行转换。 +使用 proc_macro2 的好处是可以在过程宏外部使用 proc_macro2 的类型,相反 proc_macro 中的类型只可以在过程宏的上下文中使用。 +且 proc_macro2 写出的宏更容易编写测试代码。 + +### 派生宏(derive macro 可推导宏) + +派生宏可以自动生成实现特定trait的代码,减少手动实现的繁琐性。 + +```rust +#[derive(Debug)] +struct Person { + name: String, + age: u32, +} +``` + +#[derive(Debug)]是一个派生宏,它告诉Rust编译器为Person结构体自动生成Debug trait的实现 + +### 属性宏(attribute macro) + +在Rust中,属性宏是一种特殊的宏,它允许开发者在代码上方添加自定义的属性,并在编译期间对代码进行处理。属性宏使用proc_macro_attribute属性来定义 + +```rust +extern crate proc_macro; + +use proc_macro::TokenStream; + +#[proc_macro_attribute] +pub fn attribute_macro(attr: TokenStream, item: TokenStream) -> TokenStream { + // 宏的处理逻辑 + // ... +} + +``` + +使用proc_macro_attribute属性来定义了一个名为attribute_macro的属性宏。 +属性宏接受两个TokenStream参数:attr表示属性的输入,item表示应用该属性的代码块。在宏的处理逻辑中,我们可以根据attr和item对代码进行定制化处理,并返回一个TokenStream作为输出。 + +#### 第三方实现 --> #[tokio::main] + +```rust +// tokio-macros-2.4.0/src/entry.rs +fn parse_knobs(mut input: ItemFn, is_test: bool, config: FinalConfig) -> TokenStream { + // ... + + let mut rt = match config.flavor { + RuntimeFlavor::CurrentThread => quote_spanned! {last_stmt_start_span=> + #crate_path::runtime::Builder::new_current_thread() + }, + RuntimeFlavor::Threaded => quote_spanned! {last_stmt_start_span=> + #crate_path::runtime::Builder::new_multi_thread() + }, + }; + // ... + + let generated_attrs = if is_test { + quote! { + #[::core::prelude::v1::test] + } + } else { + quote! {} + }; + + let body_ident = quote! { body }; + let last_block = quote_spanned! {last_stmt_end_span=> + #[allow(clippy::expect_used, clippy::diverging_sub_expression)] + { + return #rt + .enable_all() + .build() + .expect("Failed building the Runtime") + .block_on(#body_ident); + } + }; + + let body = input.body(); + + // .. + + input.into_tokens(generated_attrs, body, last_block) +} +``` + +### 函数宏(function-like macro) + +## 其他编程语言常见的元编程方式 + +- Go 的 ast 包和 go generate 机制:Go 没有显示提供元编程的相应机制,转而提供了一些相对不那么优雅的机制来实现类似于元编程的效果。比如 + ast 包可以暴露 Go 程序的语法树,从而让开发者可在编译时期对源代码进行修改或者根据模版生成其他类型代码。 +- C++ 的 Template 编程:据说 C++ 的 Template 编程是图灵完备的,可在编译时期完成很多让人瞠目结舌的逻辑。由于 C++ 的 Template + 编程非常复杂且难以掌握,所以易用性非常差。 +- C 语言的宏:这估计是大多数程序员对于宏的最初体验。个人觉得, C 语言中的宏本质上是发生在预处理过程的文本替换,是一种非常简单原始的元编程机制。而正是这种原始能力,导致 + C 语言的宏结合编译器的各种扩展充满了各种奇技淫巧,可读性和可调试性都非常差,而且稍不小心就很容易写出错误的宏 + +## 工具 + +### cargo-expand + +https://github.com/dtolnay/cargo-expand + +一个Rust cargo子命令扩展,通过简单的 cargo expand 命令,你可以获取当前项目中所有源码经过宏展开后的结果 + +```shell +# 直接安装 cargo-expand 插件 +$ cargo install cargo-expand +``` + +### syn + +syn 是一个对 TokenStream 解析的库,它提供了丰富的数据结构,对语法树中遇到的各种 Rust 语法都有支持。 + +比如一个 Struct 结构,在 TokenStream 中,看到的就是一系列 TokenTree,而通过 syn 解析后,struct +的各种属性以及它的各个字段,都有明确的类型。这样,我们可以很方便地通过模式匹配来选择合适的类型进行对应的处理。 + +### quote + +quote 是一个特殊的原语,它把代码转换成可以操作的数据(代码即数据) + +## 参考 + +- [Rust 的声明宏机制](https://www.cnblogs.com/RioTian/p/18130417) +- [Rust宏及声明式宏项目MacroKata](https://forsworns.github.io/zh/blogs/20210224/) \ No newline at end of file diff --git a/chapter15-macro/src/builder.rs b/chapter15-macro/src/builder.rs new file mode 100644 index 0000000..4affcdc --- /dev/null +++ b/chapter15-macro/src/builder.rs @@ -0,0 +1,160 @@ +use proc_macro2::{Ident, TokenStream}; +use quote::quote; +use syn::{ + Data, DataStruct, DeriveInput, Field, Fields, FieldsNamed, GenericArgument, Path, Type, + TypePath, +}; + +/// 我们需要的描述一个字段的所有信息 +struct Fd { + name: Ident, + ty: Type, + optional: bool, +} + +/// 我们需要的描述一个 struct 的所有信息 +pub struct BuilderContext { + name: Ident, + fields: Vec, +} + +/// 把一个 Field 转换成 Fd +impl From for Fd { + fn from(f: Field) -> Self { + let (optional, ty) = get_option_inner(&f.ty); + Self { + // 此时,我们拿到的是 NamedFields,所以 ident 必然存在 + name: f.ident.unwrap(), + optional, + ty: ty.to_owned(), + } + } +} + +/// 把 DeriveInput 转换成 BuilderContext +impl From for BuilderContext { + fn from(input: DeriveInput) -> Self { + let name = input.ident; + + let fields = if let Data::Struct(DataStruct { + fields: Fields::Named(FieldsNamed { named, .. }), + .. + }) = input.data + { + named + } else { + panic!("Unsupported data type"); + }; + + let fds = fields.into_iter().map(Fd::from).collect(); + Self { name, fields: fds } + } +} + +impl BuilderContext { + pub fn render(&self) -> TokenStream { + let name = &self.name; + // 生成 XXXBuilder 的 ident + let builder_name = Ident::new(&format!("{}Builder", name), name.span()); + + let optionized_fields = self.gen_optionized_fields(); + let methods = self.gen_methods(); + let assigns = self.gen_assigns(); + + quote! { + /// Builder 结构 + #[derive(Debug, Default)] + struct #builder_name { + #(#optionized_fields,)* + } + + /// Builder 结构每个字段赋值的方法,以及 build() 方法 + impl #builder_name { + #(#methods)* + + pub fn build(mut self) -> Result<#name, &'static str> { + Ok(#name { + #(#assigns,)* + }) + } + } + + /// 为使用 Builder 的原结构提供 builder() 方法,生成 Builder 结构 + impl #name { + fn builder() -> #builder_name { + Default::default() + } + } + } + } + + // 为 XXXBuilder 生成 Option 字段 + // 比如:executable: String -> executable: Option + fn gen_optionized_fields(&self) -> Vec { + self.fields + .iter() + .map(|Fd { name, ty, .. }| quote! { #name: std::option::Option<#ty> }) + .collect() + } + + // 为 XXXBuilder 生成处理函数 + // 比如:methods: fn executable(mut self, v: impl Into) -> Self { self.executable = Some(v); self } + fn gen_methods(&self) -> Vec { + self.fields + .iter() + .map(|Fd { name, ty, .. }| { + quote! { + pub fn #name(mut self, v: impl Into<#ty>) -> Self { + self.#name = Some(v.into()); + self + } + } + }) + .collect() + } + + // 为 XXXBuilder 生成相应的赋值语句,把 XXXBuilder 每个字段赋值给 XXX 的字段 + // 比如:#field_name: self.#field_name.take().ok_or(" xxx need to be set!") + fn gen_assigns(&self) -> Vec { + self.fields + .iter() + .map(|Fd { name, optional, .. }| { + if *optional { + return quote! { + #name: self.#name.take() + }; + } + + quote! { + #name: self.#name.take().ok_or(concat!(stringify!(#name), " needs to be set!"))? + } + }) + .collect() + } +} + +// 如果是 T = Option,返回 (true, Inner);否则返回 (false, T) +fn get_option_inner(ty: &Type) -> (bool, &Type) { + // 首先模式匹配出 segments + if let Type::Path(TypePath { + path: Path { segments, .. }, + .. + }) = ty + { + if let Some(v) = segments.iter().next() { + if v.ident == "Option" { + // 如果 PathSegment 第一个是 Option,那么它内部应该是 AngleBracketed,比如 + // 获取其第一个值,如果是 GenericArgument::Type,则返回 + let t = match &v.arguments { + syn::PathArguments::AngleBracketed(a) => match a.args.iter().next() { + Some(GenericArgument::Type(t)) => t, + _ => panic!("Not sure what to do with other GenericArgument"), + }, + _ => panic!("Not sure what to do with other PathArguments"), + }; + return (true, t); + } + } + } + (false, ty) +} diff --git a/chapter15-macro/src/lib.rs b/chapter15-macro/src/lib.rs new file mode 100644 index 0000000..e487525 --- /dev/null +++ b/chapter15-macro/src/lib.rs @@ -0,0 +1,43 @@ +// 引入 proc_macro crate,用于创建过程宏 +extern crate proc_macro; +use proc_macro::TokenStream; +use syn; +// 引入 syn crate,用于解析 Rust 代码 +use syn::{parse_macro_input, DeriveInput}; +// 引入 quote crate,用于生成代码片段 +use quote::quote; + +mod builder; + +// 定义 Builder 派生宏 +#[proc_macro_derive(Builder)] +pub fn derive_builder(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + builder::BuilderContext::from(input).render().into() +} + +// 定义 log_bench 属性宏 +#[proc_macro_attribute] +pub fn log_bench(_: TokenStream, item: TokenStream) -> TokenStream { + // 解析传入的函数定义 + let input_fn = parse_macro_input!(item as syn::ItemFn); + + // 获取函数名和函数体 + let fn_name = &input_fn.sig.ident; + let fn_block = &input_fn.block; + + // 构建新的函数定义,包含性能日志输出 + let expanded = quote! { + fn #fn_name() { + // 获取函数执行开始时间点 + let start = std::time::Instant::now(); + println!("进入函数: {}", stringify!(#fn_name)); + // 执行原函数体 + #fn_block + println!("离开函数: {} (耗时 {} ms)", stringify!(#fn_name), start.elapsed().as_millis()); + } + }; + + // 将生成的代码片段转换为 TokenStream,以便返回 + TokenStream::from(expanded) +}