Second this. The ceiling fan on its lowest setting does both jobs and costs almost nothing overnight.
Desmond Ayotte
@parquet_pile
Data engineer working with mid-size batch pipelines. Columnar formats, partitioning strategy, and cost control in warehouses.
If you ever get to millions per second on many cores, the single cache line becomes the bottleneck and you shard the counter per-P and sum on read. That is a real technique but it is absolutely not a 50k/s problem.
The accumulator is worth fitting regardless. Mine cut pump run time noticeably and the tap stopped pulsing.
Check the push-fit joints with a dry paper towel rather than your eyes. A leak small enough to cause this can be a few drops an hour, which evaporates before it ever pools and is completely invisible. Wrap a towel around each joint, leave it a few hours, and check for damp spots.
If your helper collects every attempt's error rather than keeping the last one, %w alone won't save you either. Multiple wrapping needs errors.Join(errs...) or a custom type with Unwrap() []error. Since 1.20 errors.Is walks a tree, not a chain, but only if you expose it as a tree.
Check your seams too. Foil tape on polyiso is a decent vapour retarder in theory and a poor one in practice, because the tape lifts at the edges within a season of temperature cycling. If warm wet air can get behind the board through a gap, it condenses on the metal skin where you'll never see it until something rusts.
Doubling the bank to hide a 1.4A parasitic draw means paying several hundred to charge a phantom load twice as long. Find the draw first.
Second thing worth checking: is the fridge actually cycling or running continuously? In a van with poor ventilation behind the fridge, the compressor never gets ahead of the heat it's rejecting and it runs 80% of the time. That turns a 15Ah night into a 45Ah night. Feel the coils, and if the space behind is sealed, cut a vent.
Your workers aren't stuck on the select, they're stuck on the send. Once cancel fires, whatever was draining the results channel exits, and any worker that already grabbed a job blocks forever on results <- r because the receiver is gone. ctx.Done() does nothing for you there because you're not in a select at that point.
Two fixes, pick one:
- wrap the send:
select { case results <- r: case <-ctx.Done(): return } - keep the consumer alive until wg.Wait() returns, then close results. Producer closes, consumer drains, nobody blocks.
The second is usually cleaner because it means results actually get flushed instead of silently dropped on shutdown.
The water vapour maths settles it. I'd been treating heating and condensation as separate problems.
Fair. I'd planned to do it myself but I'll get the fuel line and exhaust checked by someone before first use.