[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ETJX5YDF44MBT57NHS56G8":3,"skill-same:01M6ETJX5YDF44MBT57NHS56G8":71},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":42,"commitSha":43,"skillDirectory":44,"forksCount":45,"repositoryHtmlUrl":46,"repositoryHomepageUrl":47,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":49,"updatedAt":50,"install":51,"resources":64},"01M6ETJX5YDF44MBT57NHS56G8","async-sync-advisor",null,"Guides users on choosing between async and sync patterns for Lambda functions, including when to use tokio, rayon, and spawn_blocking. Activates when users write Lambda handlers with mixed workloads.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Femillindfors\u002Fasync-sync-advisor\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"sync","async","advisor","async sync advisor","lambda","grep","read","write","spawn","use","functions","patterns","guides","users","tokio","with","2026-11-10 10:12:30",false,"---\nname: async-sync-advisor\ndescription: Guides users on choosing between async and sync patterns for Lambda functions, including when to use tokio, rayon, and spawn_blocking. Activates when users write Lambda handlers with mixed workloads.\nallowed-tools: Read, Grep\nversion: 1.0.0\n---\n\n# Async\u002FSync Advisor Skill\n\nYou are an expert at choosing the right concurrency pattern for AWS Lambda in Rust. When you detect Lambda handlers, proactively suggest optimal async\u002Fsync patterns.\n\n## When to Activate\n\nActivate when you notice:\n- Lambda handlers with CPU-intensive operations\n- Mixed I\u002FO and compute workloads\n- Use of `tokio::task::spawn_blocking` or `rayon`\n- Questions about async vs sync or performance\n\n## Decision Guide\n\n### Use Async For: I\u002FO-Intensive Operations\n\n**When**:\n- HTTP\u002FAPI calls\n- Database queries\n- S3\u002FDynamoDB operations\n- Multiple independent I\u002FO operations\n\n**Pattern**:\n```rust\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    \u002F\u002F ✅ All I\u002FO is async - perfect use case\n    let (user, profile, settings) = tokio::try_join!(\n        fetch_user(id),\n        fetch_profile(id),\n        fetch_settings(id),\n    )?;\n\n    Ok(Response { user, profile, settings })\n}\n```\n\n### Use Sync + spawn_blocking For: CPU-Intensive Operations\n\n**When**:\n- Data processing\n- Image\u002Fvideo manipulation\n- Encryption\u002Fhashing\n- Parsing large files\n\n**Pattern**:\n```rust\nuse tokio::task;\n\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    let data = event.payload.data;\n\n    \u002F\u002F ✅ Move CPU work to blocking thread pool\n    let result = task::spawn_blocking(move || {\n        \u002F\u002F Synchronous CPU-intensive work\n        expensive_computation(&data)\n    })\n    .await??;\n\n    Ok(Response { result })\n}\n```\n\n### Use Rayon For: Parallel CPU Work\n\n**When**:\n- Processing large collections\n- Parallel data transformation\n- CPU-bound operations that can be parallelized\n\n**Pattern**:\n```rust\nuse rayon::prelude::*;\nuse tokio::task;\n\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    let items = event.payload.items;\n\n    \u002F\u002F ✅ Combine spawn_blocking with Rayon for parallel CPU work\n    let results = task::spawn_blocking(move || {\n        items\n            .par_iter()\n            .map(|item| cpu_intensive_work(item))\n            .collect::\u003CVec\u003C_>>()\n    })\n    .await?;\n\n    Ok(Response { results })\n}\n```\n\n## Mixed Workload Pattern\n\n```rust\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    \u002F\u002F Phase 1: Async I\u002FO - Download data\n    let download_futures = event.payload.urls\n        .into_iter()\n        .map(|url| async move {\n            reqwest::get(&url).await?.bytes().await\n        });\n    let raw_data = futures::future::try_join_all(download_futures).await?;\n\n    \u002F\u002F Phase 2: Sync compute - Process with Rayon\n    let processed = task::spawn_blocking(move || {\n        raw_data\n            .par_iter()\n            .map(|bytes| process_data(bytes))\n            .collect::\u003CResult\u003CVec\u003C_>, _>>()\n    })\n    .await??;\n\n    \u002F\u002F Phase 3: Async I\u002FO - Upload results\n    let upload_futures = processed\n        .into_iter()\n        .enumerate()\n        .map(|(i, data)| async move {\n            upload_to_s3(&format!(\"result-{}.dat\", i), &data).await\n        });\n    futures::future::try_join_all(upload_futures).await?;\n\n    Ok(Response { success: true })\n}\n```\n\n## Common Mistakes\n\n### ❌ Using async for CPU work\n\n```rust\n\u002F\u002F BAD: Async adds overhead for CPU-bound work\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    let result = expensive_cpu_computation(&event.payload.data);  \u002F\u002F Blocks async runtime\n    Ok(Response { result })\n}\n\n\u002F\u002F GOOD: Use spawn_blocking\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    let data = event.payload.data.clone();\n    let result = tokio::task::spawn_blocking(move || {\n        expensive_cpu_computation(&data)\n    })\n    .await?;\n    Ok(Response { result })\n}\n```\n\n### ❌ Not using concurrency for I\u002FO\n\n```rust\n\u002F\u002F BAD: Sequential I\u002FO\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    let user = fetch_user(id).await?;\n    let posts = fetch_posts(id).await?;  \u002F\u002F Waits for user first\n    Ok(Response { user, posts })\n}\n\n\u002F\u002F GOOD: Concurrent I\u002FO\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    let (user, posts) = tokio::try_join!(\n        fetch_user(id),\n        fetch_posts(id),\n    )?;\n    Ok(Response { user, posts })\n}\n```\n\n## Your Approach\n\nWhen you see Lambda handlers:\n1. Identify workload type (I\u002FO vs CPU)\n2. Suggest appropriate pattern (async vs sync)\n3. Show how to combine patterns for mixed workloads\n4. Explain performance implications\n\nProactively suggest the optimal concurrency pattern for the workload.\n","# Async\u002FSync Advisor Skill\n\nYou are an expert at choosing the right concurrency pattern for AWS Lambda in Rust. When you detect Lambda handlers, proactively suggest optimal async\u002Fsync patterns.\n\n## When to Activate\n\nActivate when you notice:\n- Lambda handlers with CPU-intensive operations\n- Mixed I\u002FO and compute workloads\n- Use of `tokio::task::spawn_blocking` or `rayon`\n- Questions about async vs sync or performance\n\n## Decision Guide\n\n### Use Async For: I\u002FO-Intensive Operations\n\n**When**:\n- HTTP\u002FAPI calls\n- Database queries\n- S3\u002FDynamoDB operations\n- Multiple independent I\u002FO operations\n\n**Pattern**:\n```rust\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    \u002F\u002F ✅ All I\u002FO is async - perfect use case\n    let (user, profile, settings) = tokio::try_join!(\n        fetch_user(id),\n        fetch_profile(id),\n        fetch_settings(id),\n    )?;\n\n    Ok(Response { user, profile, settings })\n}\n```\n\n### Use Sync + spawn_blocking For: CPU-Intensive Operations\n\n**When**:\n- Data processing\n- Image\u002Fvideo manipulation\n- Encryption\u002Fhashing\n- Parsing large files\n\n**Pattern**:\n```rust\nuse tokio::task;\n\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    let data = event.payload.data;\n\n    \u002F\u002F ✅ Move CPU work to blocking thread pool\n    let result = task::spawn_blocking(move || {\n        \u002F\u002F Synchronous CPU-intensive work\n        expensive_computation(&data)\n    })\n    .await??;\n\n    Ok(Response { result })\n}\n```\n\n### Use Rayon For: Parallel CPU Work\n\n**When**:\n- Processing large collections\n- Parallel data transformation\n- CPU-bound operations that can be parallelized\n\n**Pattern**:\n```rust\nuse rayon::prelude::*;\nuse tokio::task;\n\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    let items = event.payload.items;\n\n    \u002F\u002F ✅ Combine spawn_blocking with Rayon for parallel CPU work\n    let results = task::spawn_blocking(move || {\n        items\n            .par_iter()\n            .map(|item| cpu_intensive_work(item))\n            .collect::\u003CVec\u003C_>>()\n    })\n    .await?;\n\n    Ok(Response { results })\n}\n```\n\n## Mixed Workload Pattern\n\n```rust\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    \u002F\u002F Phase 1: Async I\u002FO - Download data\n    let download_futures = event.payload.urls\n        .into_iter()\n        .map(|url| async move {\n            reqwest::get(&url).await?.bytes().await\n        });\n    let raw_data = futures::future::try_join_all(download_futures).await?;\n\n    \u002F\u002F Phase 2: Sync compute - Process with Rayon\n    let processed = task::spawn_blocking(move || {\n        raw_data\n            .par_iter()\n            .map(|bytes| process_data(bytes))\n            .collect::\u003CResult\u003CVec\u003C_>, _>>()\n    })\n    .await??;\n\n    \u002F\u002F Phase 3: Async I\u002FO - Upload results\n    let upload_futures = processed\n        .into_iter()\n        .enumerate()\n        .map(|(i, data)| async move {\n            upload_to_s3(&format!(\"result-{}.dat\", i), &data).await\n        });\n    futures::future::try_join_all(upload_futures).await?;\n\n    Ok(Response { success: true })\n}\n```\n\n## Common Mistakes\n\n### ❌ Using async for CPU work\n\n```rust\n\u002F\u002F BAD: Async adds overhead for CPU-bound work\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    let result = expensive_cpu_computation(&event.payload.data);  \u002F\u002F Blocks async runtime\n    Ok(Response { result })\n}\n\n\u002F\u002F GOOD: Use spawn_blocking\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    let data = event.payload.data.clone();\n    let result = tokio::task::spawn_blocking(move || {\n        expensive_cpu_computation(&data)\n    })\n    .await?;\n    Ok(Response { result })\n}\n```\n\n### ❌ Not using concurrency for I\u002FO\n\n```rust\n\u002F\u002F BAD: Sequential I\u002FO\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    let user = fetch_user(id).await?;\n    let posts = fetch_posts(id).await?;  \u002F\u002F Waits for user first\n    Ok(Response { user, posts })\n}\n\n\u002F\u002F GOOD: Concurrent I\u002FO\nasync fn handler(event: LambdaEvent\u003CRequest>) -> Result\u003CResponse, Error> {\n    let (user, posts) = tokio::try_join!(\n        fetch_user(id),\n        fetch_posts(id),\n    )?;\n    Ok(Response { user, posts })\n}\n```\n\n## Your Approach\n\nWhen you see Lambda handlers:\n1. Identify workload type (I\u002FO vs CPU)\n2. Suggest appropriate pattern (async vs sync)\n3. Show how to combine patterns for mixed workloads\n4. Explain performance implications\n\nProactively suggest the optimal concurrency pattern for the workload.\n",{"name":5,"version":40,"description":7,"allowed-tools":41},"1.0.0","Read, Grep","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Femillindfors\u002Fasync-sync-advisor",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill async-sync-advisor",{"tool":57,"command":58},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill async-sync-advisor",{"tool":60,"command":61},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill async-sync-advisor","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Femillindfors\u002Fasync-sync-advisor\u002FSKILL.md",true,[65],{"path":66,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":70},"skill-report.json","REFERENCE","参考文档",9260,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Femillindfors\u002Fasync-sync-advisor\u002Fskill-report.json",[72,86,96,105,111,118],{"skillNo":73,"name":74,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":82,"publishedAt":35},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[77],{"categoryNo":78,"categoryName":79,"taxonomyType":80,"taxonomyTypeDesc":81},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[83,84,85],"model","model hierarchy","model hierarchy skill",{"skillNo":87,"name":88,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":92,"publishedAt":35},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[91],{"categoryNo":78,"categoryName":79,"taxonomyType":80,"taxonomyTypeDesc":81},[93,94,95],"MCP","zoom","zoom mcp",{"skillNo":97,"name":98,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":35},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[102,103,104,94],"sdk","zoom apps sdk","apps",{"skillNo":106,"name":107,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":35},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[107],{"skillNo":112,"name":113,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":117,"publishedAt":35},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[116],{"categoryNo":78,"categoryName":79,"taxonomyType":80,"taxonomyTypeDesc":81},[113],{"skillNo":119,"name":120,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":123,"publishedAt":35},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[120]]