{"id":1509,"date":"2026-04-12T06:19:28","date_gmt":"2026-04-11T22:19:28","guid":{"rendered":"https:\/\/blog.guguan.us.kg\/?p=1509"},"modified":"2026-05-24T01:09:33","modified_gmt":"2026-05-23T17:09:33","slug":"%e6%b5%81%e9%87%8f%e6%b6%88%e5%a4%b1%e5%99%a8","status":"publish","type":"post","link":"https:\/\/blog.guguan.us.kg\/?p=1509","title":{"rendered":"\u6d41\u91cf\u6d88\u5931\u5668"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u539f\u7248\uff1a<a href=\"https:\/\/github.com\/Richienb\/ros-data-waster\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">ROS Data Waster<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u591a\u7ebf\u7a0b\u6d88\u8017\u6d41\u91cf \u673a\u573a\u4f6c\u76f4\u547c\u5185\u884c. \u539f\u7406\u7b80\u5355\u7c97\u66b4\uff0c\u5c31\u662f\u91cd\u590d\u4e0b\u8f7d\u4e00\u4e2a\u6587\u4ef6<\/p>\n\n\n\n<style>\n\t.data-waster-config { margin-bottom: 15px; }\n\t#data-waster-status {\n\t\topacity: 0.7;\n\t\tmargin-top: 10px;\n\t}\n\tdiv.data-waster-controls button {\n\t\tcursor: pointer;\n\t\tpadding: 5px 15px;\n\t}\n<\/style>\n\n<section class=\"data-waster-container\" aria-labelledby=\"waster-title\">\n\t<div class=\"data-waster-config\">\n\t\t<label for=\"data-waster-targetMB\">\u76ee\u6807\u6d88\u8017: <\/label>\n\t\t<input type=\"number\" id=\"data-waster-targetMB\" value=\"1\" min=\"1\" style=\"width: 60px;\"> MB\n\t<\/div>\n\t<div class=\"data-waster-config\">\n\t\t<label for=\"data-waster-concurrency\">\u5e76\u53d1\u6570\u91cf: <\/label>\n\t\t<select id=\"data-waster-concurrency\">\n\t\t\t<option value=\"1\">1<\/option>\n\t\t\t<option value=\"2\">2<\/option>\n\t\t\t<option value=\"4\">4<\/option>\n\t\t\t<option value=\"8\">8<\/option>\n\t\t<\/select>\n\t<\/div>\n\t<div class=\"data-waster-controls\">\n\t\t<button id=\"data-waster-goBtn\">GO!<\/button>\n\t\t<button id=\"data-waster-stopBtn\" disabled>\u505c\u6b62<\/button>\n\t<\/div>\n\t<div id=\"data-waster-status\">\u51c6\u5907\u5c31\u7eea&#8230;<\/div>\n<\/section>\n\n<script>\n\tconst FILE_URL = \"https:\/\/db.laomoe.com\/data-waster-dummy\";\n\tconst FILE_SIZE = 800001; \/\/ \u7ea6 0.76 MB\n\n\tlet controller = null; \/\/ \u521d\u59cb\u8bbe\u4e3a\u7a7a\n\tlet running = false;\n\tlet totalDownloaded = 0;\n\tlet lastUpdateTime = 0; \/\/ \u7528\u4e8e\u8282\u6d41\n\n\tconst updateStatus = (msg, force = false) => {\n\t\tconst now = Date.now();\n\t\t\/\/ \u5f3a\u5236\u66f4\u65b0\u6216\u8005\u662f\u8ddd\u79bb\u4e0a\u6b21\u66f4\u65b0\u8d85\u8fc7100ms\u624d\u64cd\u4f5cDOM\n\t\tif (force || now - lastUpdateTime > 100) {\n\t\t\tdocument.getElementById('data-waster-status').innerText = msg;\n\t\t\tlastUpdateTime = now;\n\t\t}\n\t};\n\n\tasync function downloader() {\n\t\twhile (running) {\n\t\t\tconst targetMB = parseFloat(document.getElementById('data-waster-targetMB').value);\n\t\t\t\/\/ \u68c0\u67e5\u662f\u5426\u8fbe\u6807\n\t\t\tif (totalDownloaded \/ (1024 * 1024) >= targetMB) {\n\t\t\t\tif (running) { \/\/ \u786e\u4fdd\u53ea\u89e6\u53d1\u4e00\u6b21\u5b8c\u6210\u903b\u8f91\n\t\t\t\t\trunning = false;\n\t\t\t\t\tcontroller.abort(); \n\t\t\t\t\tupdateStatus(`\u4efb\u52a1\u5b8c\u6210\uff01\u603b\u8ba1\u6d88\u8017: ${(totalDownloaded \/ (1024 * 1024)).toFixed(2)} MB`, true);\n\t\t\t\t\ttoggleUI(false);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(`${FILE_URL}?t=${Date.now()}`, { \n\t\t\t\t\tcache: 'no-store',\n\t\t\t\t\tsignal: controller.signal \n\t\t\t\t});\n\n\t\t\t\tif (response.ok && response.body) {\n\t\t\t\t\tconst reader = response.body.getReader();\n\t\t\t\t\twhile (running) { \/\/ \u8bfb\u53d6\u8fc7\u7a0b\u4e2d\u4e5f\u8981\u68c0\u67e5 running \u72b6\u6001\n\t\t\t\t\t\tconst {done, value} = await reader.read();\n\t\t\t\t\t\tif (done) break;\n\t\t\t\t\t\t\n\t\t\t\t\t\ttotalDownloaded += value.byteLength;\n\t\t\t\t\t\tupdateStatus(`\u5df2\u6d88\u8017: ${(totalDownloaded \/ (1024 * 1024)).toFixed(2)} MB`);\n\t\t\t\t\t}\n\t\t\t\t\treader.releaseLock(); \/\/ \u91ca\u653e\u6d41\u9501\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tif (e.name === 'AbortError') break; \/\/ \u6b63\u5e38\u505c\u6b62\uff0c\u9000\u51fa\u5faa\u73af\n\t\t\t\tconsole.error(\"\u4e0b\u8f7d\u51fa\u9519\u55b5:\", e);\n\t\t\t\tawait new Promise(r => setTimeout(r, 500)); \/\/ \u51fa\u9519\u6b47 0.5 \u79d2\u518d\u8bd5\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction toggleUI(isRunning) {\n\t\tdocument.getElementById('data-waster-goBtn').disabled = isRunning;\n\t\tdocument.getElementById('data-waster-stopBtn').disabled = !isRunning;\n\t\tdocument.getElementById('data-waster-targetMB').disabled = isRunning;\n\t\tdocument.getElementById('data-waster-concurrency').disabled = isRunning;\n\t}\n\n\tdocument.getElementById('data-waster-goBtn').onclick = () => {\n\t\trunning = true;\n\t\ttotalDownloaded = 0;\n\t\t\/\/ \u5173\u952e\uff1a\u6bcf\u6b21\u5f00\u59cb\u4efb\u52a1\u90fd\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u63a7\u5236\u5668\u55b5\uff01\n\t\tcontroller = new AbortController(); \n\t\t\n\t\tconst threads = parseInt(document.getElementById('data-waster-concurrency').value);\n\t\ttoggleUI(true);\n\n\t\tfor (let i = 0; i < threads; i++) { downloader(); }\n\t};\n\n\tdocument.getElementById('data-waster-stopBtn').onclick = () => {\n\t\trunning = false;\n\t\tif (controller) controller.abort(); \n\t\ttoggleUI(false);\n\t};\n<\/script>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b49\u6548Shell\u547d\u4ee4\uff08\u5728\u670d\u52a1\u5668\u4e0a\u8fd0\u884c\uff09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>count=10 i=1; while &#91; $i -le $count ]; do wget -O \/dev\/null https:\/\/db.laomoe.com\/data-waster-dummy; i=$((i+1)); &#91; $i -le $count ] &amp;&amp; sleep 10; done<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u4e2a\u5a31\u4e50\u5c0f\u5de5\u5177\uff0c\u5acc\u6d41\u91cf\u591a\u7684\u53ef\u4ee5\u73a9\u4e00\u73a9<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[140],"class_list":["post-1509","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-tools"],"_links":{"self":[{"href":"https:\/\/blog.guguan.us.kg\/index.php?rest_route=\/wp\/v2\/posts\/1509","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.guguan.us.kg\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.guguan.us.kg\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.guguan.us.kg\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.guguan.us.kg\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1509"}],"version-history":[{"count":8,"href":"https:\/\/blog.guguan.us.kg\/index.php?rest_route=\/wp\/v2\/posts\/1509\/revisions"}],"predecessor-version":[{"id":1641,"href":"https:\/\/blog.guguan.us.kg\/index.php?rest_route=\/wp\/v2\/posts\/1509\/revisions\/1641"}],"wp:attachment":[{"href":"https:\/\/blog.guguan.us.kg\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1509"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.guguan.us.kg\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1509"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.guguan.us.kg\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}