# Concurrent Programming

A programming discipline involving processes and threads as execution units.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Python 3.14 free-threaded build is now available in RHEL

DevFeed: [Python 3.14 free-threaded build is now available in RHEL](<https://devfeed.tech/articles/python-3-14-free-threaded-build-is-now-available-in-rhel-17432.md>)

Original publisher: [Read original article](<https://developers.redhat.com/articles/2026/09/14/python-314-free-threaded-build-now-available-rhel>)

Author: Lumír Balhar

Published: 2026-09-14T13:01:41Z

Content type: release

Language: en

Sources: [Red Hat](<https://devfeed.tech/sources/red-hat.md>), [Red Hat Developer](<https://devfeed.tech/sources/red-hat-developer.md>)

Topics: [Python 3.14](<https://devfeed.tech/topics/python-3-14.md>), [Python](<https://devfeed.tech/topics/python.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Linux](<https://devfeed.tech/topics/linux.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [cpu](<https://devfeed.tech/topics/cpu.md>)

Tags: [cpu](<https://devfeed.tech/tags/cpu.md>), [developer-tools](<https://devfeed.tech/tags/developer-tools.md>), [developers](<https://devfeed.tech/tags/developers.md>), [linux](<https://devfeed.tech/tags/linux.md>), [performance](<https://devfeed.tech/tags/performance.md>), [programming-languages-frameworks](<https://devfeed.tech/tags/programming-languages-frameworks.md>), [python](<https://devfeed.tech/tags/python.md>), [python-3-14](<https://devfeed.tech/tags/python-3-14.md>), [red-hat](<https://devfeed.tech/tags/red-hat.md>), [release](<https://devfeed.tech/tags/release.md>), [rhel](<https://devfeed.tech/tags/rhel.md>), [thread](<https://devfeed.tech/tags/thread.md>), [upstream-release](<https://devfeed.tech/tags/upstream-release.md>)

### AI overview

Red Hat Enterprise Linux 9.8 and 10.2 now provide a free-threaded Python 3.14 build through the Red Hat CodeReady Linux Builder repositories. With the GIL disabled, CPU-bound Python threads can execute in parallel across multiple CPU cores within a single process. The article explains expected performance benefits, installation, verification, and possible thread-safety issues in existing code.

### Source excerpt

Developers on Red Hat Enterprise Linux 9.8 and 10.2 can now test full parallel CPU execution in Python using the new free-threaded Python 3.14 build. In addition to the regular Python 3.14 interpreter, we also provide the free-threaded variant in the Red Hat CodeReady Linux Builder repositories. Python 3.14 is the first upstream release where the free-threaded build is officially supported rather than experimental. The post Python 3.14 free-threaded build is now available in RHEL appeared first on Red Hat Developer.

## Back to the Basics. Threads.

DevFeed: [Back to the Basics. Threads.](<https://devfeed.tech/articles/back-to-the-basics-threads-38706.md>)

Original publisher: [Read original article](<https://dataengineeringcentral.substack.com/p/back-to-the-basics-threads>)

Author: Daniel Beach

Published: 2026-09-14T12:19:11Z

Content type: tutorial

Language: en

Sources: [Data Engineering Central](<https://devfeed.tech/sources/data-engineering-central.md>)

Topics: [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Rust](<https://devfeed.tech/topics/rust.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [Python](<https://devfeed.tech/topics/python.md>)

Tags: [concurrency](<https://devfeed.tech/tags/concurrency.md>), [programming](<https://devfeed.tech/tags/programming.md>), [python](<https://devfeed.tech/tags/python.md>), [rust](<https://devfeed.tech/tags/rust.md>), [threads](<https://devfeed.tech/tags/threads.md>)

### AI overview

An introductory, applied discussion of threads and concurrency, focusing on Rust and briefly recalling Python ProcessPools for parallel data and file processing.

### Source excerpt

staying grounded in an agentic world

## Speeding Up Azure Durable Functions with Fan-Out/Fan-In and a Higher Concurrency Limit

DevFeed: [Speeding Up Azure Durable Functions with Fan-Out/Fan-In and a Higher Concurrency Limit](<https://devfeed.tech/articles/2-changes-made-our-azure-durable-functions-3x-faster-32183.md>)

Original publisher: [Read original article](<https://spin.atomicobject.com/azure-durable-functions-3x/>)

Author: Michael Li

Published: 2026-09-14T12:00:32Z

Content type: tutorial

Language: en

Sources: [Atomic Object](<https://devfeed.tech/sources/atomic-object.md>)

Topics: [Azure](<https://devfeed.tech/topics/azure.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [apis](<https://devfeed.tech/tags/apis.md>), [azure](<https://devfeed.tech/tags/azure.md>), [azure-functions](<https://devfeed.tech/tags/azure-functions.md>), [batch](<https://devfeed.tech/tags/batch.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [development-practices](<https://devfeed.tech/tags/development-practices.md>), [file](<https://devfeed.tech/tags/file.md>), [storage](<https://devfeed.tech/tags/storage.md>)

### AI overview

An Azure Durable Functions batch job was accelerated by combining fan-out/fan-in orchestration with a higher function-host concurrency limit. Together, the changes reduced a representative run from about 710 seconds to about 240 seconds.

### Source excerpt

For one of our projects, we run a nightly job that generates a batch of files. It's a long process: pulling records from an upstream system, calling several APIs to gather info about each one, generating a file per record, and writing the results back to storage. For a small batch, this works fine, but [...] The post 2 Changes Made Our Azure Durable Functions 3X Faster appeared first on Atomic Spin.

## Scaling real-time AI agents with session-aware load balancing

DevFeed: [Scaling real-time AI agents with session-aware load balancing](<https://devfeed.tech/articles/scaling-real-time-ai-agents-with-session-aware-load-balancing-4217.md>)

Original publisher: [Read original article](<https://developers.googleblog.com/scaling-real-time-ai-agents-with-session-aware-load-balancing/>)

Author: Simerus Mahesh

Published: 2026-09-12T11:04:33.891311Z

Content type: article

Language: en

Sources: [Google Developers Blog](<https://devfeed.tech/sources/google-developers-blog.md>)

Topics: [real-time](<https://devfeed.tech/topics/real-time.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [Streaming](<https://devfeed.tech/topics/streaming.md>), [Server](<https://devfeed.tech/topics/server.md>), [gRPC](<https://devfeed.tech/topics/grpc.md>), [WebSocket](<https://devfeed.tech/topics/websocket.md>), [cpu](<https://devfeed.tech/topics/cpu.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>)

Tags: [ai-agents](<https://devfeed.tech/tags/ai-agents.md>), [concurrent](<https://devfeed.tech/tags/concurrent.md>), [cpu](<https://devfeed.tech/tags/cpu.md>), [real-time](<https://devfeed.tech/tags/real-time.md>), [routing](<https://devfeed.tech/tags/routing.md>), [server](<https://devfeed.tech/tags/server.md>), [streaming](<https://devfeed.tech/tags/streaming.md>)

### AI overview

This article explains why real-time AI agents require session-aware load balancing. Long-lived, stateful bidirectional streams make request rates and CPU utilization insufficient measures of backend capacity. The proposed approach tracks active sessions at the application level and combines session counts with CPU metrics to distribute traffic and avoid bottlenecks.

### Source excerpt

Real-time AI agents break traditional request-response load balancing paradigms because they rely on long-lived, stateful bidirectional streams that obscure true server capacity. To solve this, developers must implement application-level session tracking directly within the runtime to accurately measure the committed concurrent workload of active conversations. By feeding these precise session counts alongside standard CPU utilization metrics into a hybrid routing algorithm, infrastructure can effectively distribute stateful AI traffic and prevent individual backend bottlenecks.

## A Bootiful Podcast: Netflix's Paul Bakker

DevFeed: [A Bootiful Podcast: Netflix's Paul Bakker](<https://devfeed.tech/articles/a-bootiful-podcast-netflix-s-paul-bakker-3537.md>)

Original publisher: [Read original article](<https://spring.io/blog/2026/09/10/a-bootiful-podcast-paul-bakker>)

Author: joshlong

Published: 2026-09-10T00:00:00Z

Content type: article

Language: en

Sources: [Spring](<https://devfeed.tech/sources/spring.md>)

Topics: [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Tooling](<https://devfeed.tech/topics/tooling.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [batch](<https://devfeed.tech/tags/batch.md>), [boot](<https://devfeed.tech/tags/boot.md>), [cloud](<https://devfeed.tech/tags/cloud.md>), [complexity](<https://devfeed.tech/tags/complexity.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [event-driven](<https://devfeed.tech/tags/event-driven.md>), [java](<https://devfeed.tech/tags/java.md>), [microservices](<https://devfeed.tech/tags/microservices.md>), [netflix](<https://devfeed.tech/tags/netflix.md>), [podcast](<https://devfeed.tech/tags/podcast.md>), [reactive](<https://devfeed.tech/tags/reactive.md>), [serverless](<https://devfeed.tech/tags/serverless.md>), [spring](<https://devfeed.tech/tags/spring.md>), [tooling](<https://devfeed.tech/tags/tooling.md>), [web-applications](<https://devfeed.tech/tags/web-applications.md>)

### AI overview

A podcast interview with Netflix's Paul Bakker on scaling Java, adopting newer JDKs to reduce costs, and using virtual threads and structured concurrency instead of reactive complexity. It also previews AI-powered tooling and Project Valhalla's future.

### Source excerpt

Hi, Spring fans! This week's interview is a must-watch if you care about where Java is headed next. This week, I talk to Netflix's Paull Bakker! We dig into Netflix's real-world playbook for scaling Java, cutting costs with newer JDKs, and replacing reactive complexity with virtual threads and structured concurrency. Plus, there's a sneak peek at the exciting future of Java, from AI-powered tooling to the upcoming Valhalla era.

## A quick overview of atomics in C

DevFeed: [A quick overview of atomics in C](<https://devfeed.tech/articles/a-quick-overview-of-atomics-in-c-29428.md>)

Original publisher: [Read original article](<https://lemire.me/blog/2026/09/09/a-quick-overview-of-atomics-in-c/>)

Author: Daniel Lemire

Published: 2026-09-09T20:41:53Z

Content type: tutorial

Language: en

Sources: [Daniel Lemire](<https://devfeed.tech/sources/daniel-lemire.md>)

Topics: [C](<https://devfeed.tech/topics/c.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Programming](<https://devfeed.tech/topics/programming.md>)

Tags: [atomics](<https://devfeed.tech/tags/atomics.md>), [c](<https://devfeed.tech/tags/c.md>), [join](<https://devfeed.tech/tags/join.md>), [ordering](<https://devfeed.tech/tags/ordering.md>), [posix](<https://devfeed.tech/tags/posix.md>), [programming-language](<https://devfeed.tech/tags/programming-language.md>), [systems](<https://devfeed.tech/tags/systems.md>), [thread](<https://devfeed.tech/tags/thread.md>), [threads](<https://devfeed.tech/tags/threads.md>)

### AI overview

This tutorial introduces atomics in C, explaining data races on shared non-atomic variables, atomic accesses, instruction reordering, and memory-ordering models including relaxed, release, and acquire semantics. It also discusses C11 threads and platform support limitations.

### Source excerpt

If you write in C, by default, you use a single thread. Extra cores do not help until you create more threads. However, if you include the header <threads.h>, you can pass a function to thrd_create, and wait for it with thrd_join. #include <threads.h> #include <stdio.h> int worker(void *arg) { printf("hello from thread %d\n", *(int ... Continue reading A quick overview of atomics in C

## Redesigning Kubernetes Workqueues and Resyncs to Reduce Thundering Herd Effects

DevFeed: [Redesigning Kubernetes Workqueues and Resyncs to Reduce Thundering Herd Effects](<https://devfeed.tech/articles/this-shit-is-hard-taming-the-thundering-herd-13289.md>)

Original publisher: [Read original article](<https://www.chainguard.dev/unchained/this-shit-is-hard-taming-the-thundering-herd>)

Published: 2026-09-02T00:00:00Z

Content type: article

Language: en

Sources: [Chainguard: Unchained](<https://devfeed.tech/sources/chainguard-unchained.md>)

Topics: [Kubernetes](<https://devfeed.tech/topics/kubernetes.md>), [systems](<https://devfeed.tech/topics/systems.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Latency](<https://devfeed.tech/topics/latency.md>), [Maintainers](<https://devfeed.tech/topics/maintainers.md>)

Tags: [architecture](<https://devfeed.tech/tags/architecture.md>), [concurrent](<https://devfeed.tech/tags/concurrent.md>), [defense-in-depth](<https://devfeed.tech/tags/defense-in-depth.md>), [failover](<https://devfeed.tech/tags/failover.md>), [goroutines](<https://devfeed.tech/tags/goroutines.md>), [kubernetes](<https://devfeed.tech/tags/kubernetes.md>), [latency](<https://devfeed.tech/tags/latency.md>), [maintainers](<https://devfeed.tech/tags/maintainers.md>), [reconciliation](<https://devfeed.tech/tags/reconciliation.md>), [thundering-herd](<https://devfeed.tech/tags/thundering-herd.md>)

### AI overview

This article explains how Kubernetes controllers can experience thundering herd effects when restarts, leader failovers, or periodic resyncs cause many keys to enter an in-memory workqueue at once. It describes the queue and informer behavior behind the problem and introduces Chainguard's redesign of workqueues and resyncs to improve reconciliation under these conditions.

### Source excerpt

The thundering herd is an architecture problem. See how Chainguard redesigned workqueues and resyncs to keep reconciliation running smoothly.

## Async Programming in Python: From Generators to asyncio

DevFeed: [Async Programming in Python: From Generators to asyncio](<https://devfeed.tech/articles/async-programming-in-python-from-generators-to-asyncio-4397.md>)

Original publisher: [Read original article](<https://realpython.com/python-async-features/>)

Author: Doug Farrell

Published: 2026-08-31T14:00:00Z

Content type: tutorial

Language: en

Sources: [Real Python](<https://devfeed.tech/sources/real-python.md>)

Topics: [Python](<https://devfeed.tech/topics/python.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [IO](<https://devfeed.tech/topics/io.md>), [Code](<https://devfeed.tech/topics/code.md>), [Python 3.14](<https://devfeed.tech/topics/python-3-14.md>)

Tags: [automation](<https://devfeed.tech/tags/automation.md>), [batch](<https://devfeed.tech/tags/batch.md>), [code](<https://devfeed.tech/tags/code.md>), [learning](<https://devfeed.tech/tags/learning.md>), [programming](<https://devfeed.tech/tags/programming.md>), [python](<https://devfeed.tech/tags/python.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

A tutorial on Python asynchronous programming, explaining how event loops, coroutines, async and await enable a single-threaded program to handle slow I/O without blocking. It progresses from synchronous code and generators to concurrent task execution with asyncio, using examples compatible with Python 3.11 and later.

### Source excerpt

Learn how Python async programming works. Write async functions with async and await, and run slow I/O operations concurrently with asyncio.

## Concurrent Servers: Part 8 - Go

DevFeed: [Concurrent Servers: Part 8 - Go](<https://devfeed.tech/articles/concurrent-servers-part-8-go-35141.md>)

Original publisher: [Read original article](<https://eli.thegreenplace.net/2026/concurrent-servers-part-8-go/>)

Author: Eli Bendersky

Published: 2026-08-22T14:52:00Z

Content type: tutorial

Language: en

Sources: [Eli Bendersky](<https://devfeed.tech/sources/eli-bendersky.md>)

Topics: [Go Language](<https://devfeed.tech/topics/go-language.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Server](<https://devfeed.tech/topics/server.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Network](<https://devfeed.tech/topics/network.md>)

Tags: [capacity](<https://devfeed.tech/tags/capacity.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [concurrent](<https://devfeed.tech/tags/concurrent.md>), [go](<https://devfeed.tech/tags/go.md>), [goroutines](<https://devfeed.tech/tags/goroutines.md>), [misc](<https://devfeed.tech/tags/misc.md>), [network-programming](<https://devfeed.tech/tags/network-programming.md>), [servers](<https://devfeed.tech/tags/servers.md>), [threads](<https://devfeed.tech/tags/threads.md>)

### AI overview

Part 8 of a series on concurrent network servers explains how Go implements sequential and concurrent servers. It demonstrates serving each client with a lightweight goroutine and discusses why concurrency may still need to be limited, including when tasks compete for finite CPU capacity.

### Source excerpt

This is part 8 in a series of posts on writing concurrent network servers. In this part, we'll switch to Go and see how it tackles the challenges described earlier in the series. All posts in the series: Part 1 - Introduction Part 2 - Threads Part 3 - Event-driven Part 4 - libuv ...

## Tips for Saving Game Data in Godot

DevFeed: [Tips for Saving Game Data in Godot](<https://devfeed.tech/articles/tips-for-saving-game-data-in-godot-40649.md>)

Original publisher: [Read original article](<https://eviltrout.com/blog/2026-08-21-tips-for-saving-game-data-in-godot/>)

Published: 2026-08-21T00:00:00Z

Content type: tutorial

Language: en

Sources: [Robin Ward](<https://devfeed.tech/sources/robin-ward.md>)

Topics: [Godot](<https://devfeed.tech/topics/godot.md>), [saving](<https://devfeed.tech/topics/saving.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [data](<https://devfeed.tech/topics/data.md>), [JSON](<https://devfeed.tech/topics/json.md>), [Hardware](<https://devfeed.tech/topics/hardware.md>), [Testing](<https://devfeed.tech/topics/testing.md>)

Tags: [bug](<https://devfeed.tech/tags/bug.md>), [code](<https://devfeed.tech/tags/code.md>), [disk-space](<https://devfeed.tech/tags/disk-space.md>), [game](<https://devfeed.tech/tags/game.md>), [games](<https://devfeed.tech/tags/games.md>), [json](<https://devfeed.tech/tags/json.md>), [mutex](<https://devfeed.tech/tags/mutex.md>), [os](<https://devfeed.tech/tags/os.md>), [saving](<https://devfeed.tech/tags/saving.md>), [testing](<https://devfeed.tech/tags/testing.md>), [thread](<https://devfeed.tech/tags/thread.md>), [tips](<https://devfeed.tech/tags/tips.md>)

### AI overview

This tutorial describes a save-data approach for Godot games, based on experience shipping two games. It compares custom binary and JSON formats, recommends frequent debounced saves on a separate thread, checks available disk space, and discusses temporary-file replacement to reduce corrupted save-game reports.

### Source excerpt

Saving game data is easy. Making your save code survive every kind of hardware failure is not. A lot of these issues will never show up during testing, but if your game reaches a wide audience with many different kinds of hard drives in different states of degradation, you will start to get bug reports about save games not working. I decided to write up my approach, learned over the course of shipping two Godot games, that has reduced our corrupted save game bug reports to virtually nothing.

## Concurrent Servers: Part 7 - Rust

DevFeed: [Concurrent Servers: Part 7 - Rust](<https://devfeed.tech/articles/concurrent-servers-part-7-rust-35140.md>)

Original publisher: [Read original article](<https://eli.thegreenplace.net/2026/concurrent-servers-part-7-rust/>)

Author: Eli Bendersky

Published: 2026-08-15T16:41:00Z

Content type: tutorial

Language: en

Sources: [Eli Bendersky](<https://devfeed.tech/sources/eli-bendersky.md>)

Topics: [Rust](<https://devfeed.tech/topics/rust.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Network](<https://devfeed.tech/topics/network.md>), [Server](<https://devfeed.tech/topics/server.md>), [Programming](<https://devfeed.tech/topics/programming.md>)

Tags: [concurrency](<https://devfeed.tech/tags/concurrency.md>), [concurrent](<https://devfeed.tech/tags/concurrent.md>), [misc](<https://devfeed.tech/tags/misc.md>), [network](<https://devfeed.tech/tags/network.md>), [network-programming](<https://devfeed.tech/tags/network-programming.md>), [programming](<https://devfeed.tech/tags/programming.md>), [programming-language](<https://devfeed.tech/tags/programming-language.md>), [rust](<https://devfeed.tech/tags/rust.md>), [servers](<https://devfeed.tech/tags/servers.md>), [threads](<https://devfeed.tech/tags/threads.md>)

### AI overview

Part 7 of a series on concurrent network servers explains how to implement the series' state-machine protocol in Rust. It covers a sequential server, one thread per client, and a fixed thread pool.

### Source excerpt

This is part 7 in a series of posts on writing concurrent network servers. In this part, we discuss how the challenges described in earlier parts are tackled in the Rust programming language. All posts in the series: Part 1 - Introduction Part 2 - Threads Part 3 - Event-driven Part 4 - libuv ...

## Sendable and @Sendable closures explained with code examples

DevFeed: [Sendable and @Sendable closures explained with code examples](<https://devfeed.tech/articles/sendable-and-sendable-closures-explained-with-code-examples-11487.md>)

Original publisher: [Read original article](<https://www.avanderlee.com/swift/sendable-protocol-closures/>)

Author: Antoine van der Lee

Published: 2026-08-09T11:53:15Z

Content type: article

Language: en

Sources: [SwiftLee](<https://devfeed.tech/sources/swiftlee.md>)

Topics: [Swift](<https://devfeed.tech/topics/swift.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Code](<https://devfeed.tech/topics/code.md>), [async/await](<https://devfeed.tech/topics/async-await.md>)

Tags: [code](<https://devfeed.tech/tags/code.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [examples](<https://devfeed.tech/tags/examples.md>), [swift](<https://devfeed.tech/tags/swift.md>)

### AI overview

This article explains Swift's Sendable protocol and the @Sendable closure attribute. It describes how the compiler checks whether values can safely cross concurrency domains such as actors, tasks, and threads, including examples involving value types, classes, generics, and enums with associated values.

### Source excerpt

Sendable is a protocol in Swift that indicates a type is safe to share across concurrency domains like actors, tasks, and threads. When a type conforms to Sendable, the compiler verifies at compile time that passing it around can't introduce data races. Together with the @Sendable attribute for closures, it's one of the core building ... -> The post Sendable and @Sendable closures explained with code examples appeared first on SwiftLee.

## The Real Python Podcast - Episode #303: Free-Threaded Python's History & uv in Production

DevFeed: [The Real Python Podcast - Episode #303: Free-Threaded Python's History & uv in Production](<https://devfeed.tech/articles/the-real-python-podcast-episode-303-free-threaded-python-s-history-uv-in-production-4387.md>)

Original publisher: [Read original article](<https://realpython.com/podcasts/rpp/303/>)

Author: Real Python

Published: 2026-07-17T12:00:00Z

Content type: article

Language: en

Sources: [Real Python](<https://devfeed.tech/sources/real-python.md>)

Topics: [Python](<https://devfeed.tech/topics/python.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Wagtail](<https://devfeed.tech/topics/wagtail.md>), [Django](<https://devfeed.tech/topics/django.md>), [Compiler](<https://devfeed.tech/topics/compiler.md>), [GitHub Copilot CLI](<https://devfeed.tech/topics/github-copilot-cli.md>), [Model Context Protocol](<https://devfeed.tech/topics/model-context-protocol.md>)

Tags: [article](<https://devfeed.tech/tags/article.md>), [cli](<https://devfeed.tech/tags/cli.md>), [github-copilot](<https://devfeed.tech/tags/github-copilot.md>), [github-copilot-cli](<https://devfeed.tech/tags/github-copilot-cli.md>), [locks](<https://devfeed.tech/tags/locks.md>), [mcp](<https://devfeed.tech/tags/mcp.md>), [podcast](<https://devfeed.tech/tags/podcast.md>), [production](<https://devfeed.tech/tags/production.md>), [python](<https://devfeed.tech/tags/python.md>), [techniques](<https://devfeed.tech/tags/techniques.md>)

### AI overview

This podcast episode discusses the history of attempts to remove Python's Global Interpreter Lock, the current free-threaded Python approach, and the challenges of running multiple tasks concurrently within one process. It also covers Python community news and projects, including JIT compiler work, GitHub Copilot CLI, MCP server testing, uv in production, Wagtail with Django, Python code quality, and thread-safety techniques.

### Source excerpt

How many attempts have been made to remove Python's Global Interpreter Lock (GIL)? How do they compare to the current approach? Christopher Trudeau is back on the show this week with another batch of PyCoder's Weekly articles and projects.

## Crystal 1.21.0 is released!

DevFeed: [Crystal 1.21.0 is released!](<https://devfeed.tech/articles/crystal-1-21-0-is-released-22338.md>)

Original publisher: [Read original article](<https://crystal-lang.org/2026/07/16/1.21.0-released/>)

Author: Johannes Müller

Published: 2026-07-16T00:00:00Z

Content type: release

Language: en

Sources: [Crystal](<https://devfeed.tech/sources/crystal.md>)

Topics: [Crystal](<https://devfeed.tech/topics/crystal.md>), [releases](<https://devfeed.tech/topics/releases.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>)

Tags: [bug-fixes](<https://devfeed.tech/tags/bug-fixes.md>), [changelog](<https://devfeed.tech/tags/changelog.md>), [new-features](<https://devfeed.tech/tags/new-features.md>), [release](<https://devfeed.tech/tags/release.md>)

### AI overview

Crystal 1.21.0 introduces execution contexts enabled by default, string array literals with interpolation, split manpages infrastructure, and other language, compiler, and standard-library changes. The release includes bug fixes and 161 changes from 21 contributors.

### Source excerpt

We are announcing a new Crystal release 1.21.0 with several new features and bug fixes.

## Test & Set

DevFeed: [Test & Set](<https://devfeed.tech/articles/test-set-32253.md>)

Original publisher: [Read original article](<https://publicobject.com/2026/07/13/test-set/>)

Author: Jesse Wilson

Published: 2026-07-13T22:22:27Z

Content type: tutorial

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Code](<https://devfeed.tech/topics/code.md>), [function](<https://devfeed.tech/topics/function.md>), [business logic](<https://devfeed.tech/topics/business-logic.md>)

Tags: [business-logic](<https://devfeed.tech/tags/business-logic.md>), [code](<https://devfeed.tech/tags/code.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [flaky-tests](<https://devfeed.tech/tags/flaky-tests.md>), [function](<https://devfeed.tech/tags/function.md>), [programming](<https://devfeed.tech/tags/programming.md>), [tests](<https://devfeed.tech/tags/tests.md>), [threads](<https://devfeed.tech/tags/threads.md>)

### AI overview

An article about managing concurrency in threaded programs. It discusses the limits of simple and stress tests, describes a trusted concurrency pattern, and presents a helper function that separates business logic from concurrency logic while retrying after a lost race.

### Source excerpt

Working with threads always feels hazardous to me. Non-determinism limits how much we can exercise with simple tests. Stress tests can shake out some bugs, but they're slow and potentially flaky. I don't like flaky tests. So I have a few concurrency patterns that I trust, and I

## Releasing Execution Contexts

DevFeed: [Releasing Execution Contexts](<https://devfeed.tech/articles/releasing-execution-contexts-22337.md>)

Original publisher: [Read original article](<https://crystal-lang.org/2026/07/12/releasing-execution-contexts/>)

Author: Julien Portalier

Published: 2026-07-12T00:00:00Z

Content type: release

Language: en

Sources: [Crystal](<https://devfeed.tech/sources/crystal.md>)

Topics: [Crystal](<https://devfeed.tech/topics/crystal.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [context](<https://devfeed.tech/topics/context.md>), [cpu](<https://devfeed.tech/topics/cpu.md>)

Tags: [concurrent](<https://devfeed.tech/tags/concurrent.md>), [cpu](<https://devfeed.tech/tags/cpu.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [main-thread](<https://devfeed.tech/tags/main-thread.md>), [multithreading](<https://devfeed.tech/tags/multithreading.md>), [parallelism](<https://devfeed.tech/tags/parallelism.md>), [threads](<https://devfeed.tech/tags/threads.md>)

### AI overview

Crystal is introducing Execution Contexts, an interface for orchestrating fibers across one or more threads. The article describes concurrent and parallel contexts, configurable parallelism, and execution across CPU cores while preserving a single-threaded default.

### Source excerpt

Two and a half years ago, with the invaluable support from 84codes, we re-examined the multithreading model inherited from Crystal 0.28 (preview MT).

## Deadlocks and downtime

DevFeed: [Deadlocks and downtime](<https://devfeed.tech/articles/deadlocks-and-downtime-2323.md>)

Original publisher: [Read original article](<https://planetscale.com/blog/deadlocks-and-downtime>)

Author: Simeon Griggs

Published: 2026-07-08T00:00:00Z

Content type: tutorial

Language: en

Sources: [Blog -- PlanetScale](<https://devfeed.tech/sources/blog-planetscale.md>)

Topics: [Database](<https://devfeed.tech/topics/database.md>), [Deadlock](<https://devfeed.tech/topics/deadlock.md>), [Transactions](<https://devfeed.tech/topics/transactions.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>)

Tags: [database](<https://devfeed.tech/tags/database.md>), [deadlock](<https://devfeed.tech/tags/deadlock.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [errors](<https://devfeed.tech/tags/errors.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [learn](<https://devfeed.tech/tags/learn.md>), [postgres](<https://devfeed.tech/tags/postgres.md>), [reduce](<https://devfeed.tech/tags/reduce.md>), [transactions](<https://devfeed.tech/tags/transactions.md>)

### AI overview

This article explains how Postgres deadlocks arise when concurrent transactions hold locks that each other needs, and how those deadlocks can escalate into database downtime. It examines the effects of high query volume and immediate retry loops, then recommends consistent row-update ordering, smaller transactions, and late locking to reduce the risk.

### Source excerpt

Deadlocks happen when transactions block each other. Learn how they escalate into downtime, how to reduce them through better queries and retry logic, and how Traffic Control can protect your database from your application.

## How we scale PgBouncer in ClickHouse Managed Postgres

DevFeed: [How we scale PgBouncer in ClickHouse Managed Postgres](<https://devfeed.tech/articles/how-we-scale-pgbouncer-in-clickhouse-managed-postgres-5493.md>)

Original publisher: [Read original article](<https://clickhouse.com/blog/pgbouncer-clickhouse-managed-postgres>)

Author: Kaushik Iska

Published: 2026-07-01T15:40:41Z

Content type: article

Language: en

Sources: [ClickHouse Blog](<https://devfeed.tech/sources/clickhouse-blog.md>)

Topics: [clickhouse](<https://devfeed.tech/topics/clickhouse.md>), [Processes](<https://devfeed.tech/topics/processes.md>), [Process](<https://devfeed.tech/topics/process.md>), [cpu](<https://devfeed.tech/topics/cpu.md>), [Amazon EC2](<https://devfeed.tech/topics/amazon-ec2.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [benchmarking](<https://devfeed.tech/topics/benchmarking.md>), [Server](<https://devfeed.tech/topics/server.md>)

Tags: [aws](<https://devfeed.tech/tags/aws.md>), [benchmarks](<https://devfeed.tech/tags/benchmarks.md>), [clickhouse](<https://devfeed.tech/tags/clickhouse.md>), [cpu](<https://devfeed.tech/tags/cpu.md>), [hardware](<https://devfeed.tech/tags/hardware.md>), [process](<https://devfeed.tech/tags/process.md>), [processes](<https://devfeed.tech/tags/processes.md>), [server](<https://devfeed.tech/tags/server.md>), [transactions](<https://devfeed.tech/tags/transactions.md>)

### AI overview

ClickHouse Managed Postgres scales PgBouncer connection pooling by running a peered fleet of processes across available CPU cores. Benchmarks on identical AWS EC2 setups show the 16-process fleet reaching roughly 336,000 transactions per second, about four times the single-process result.

### Source excerpt

PgBouncer is single-threaded, so a single process caps out at one CPU core no matter the box size. See how ClickHouse Managed Postgres runs a peered fleet of PgBouncer processes with so_reuseport to scale pooling across every core -- with benchmarks showin

## Logic for Programmers extra credits

DevFeed: [Logic for Programmers extra credits](<https://devfeed.tech/articles/logic-for-programmers-extra-credits-25490.md>)

Original publisher: [Read original article](<https://buttondown.com/hillelwayne/archive/logic-for-programmers-extra-credits/>)

Author: Hillel Wayne

Published: 2026-06-02T14:48:48Z

Content type: article

Language: en

Sources: [Newsletter feed for Hillel Wayne's Newsletter](<https://devfeed.tech/sources/newsletter-feed-for-hillel-wayne-s-newsletter.md>)

Topics: [Math and Logic](<https://devfeed.tech/topics/math-and-logic.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>)

Tags: [book](<https://devfeed.tech/tags/book.md>), [concurrent](<https://devfeed.tech/tags/concurrent.md>), [math](<https://devfeed.tech/tags/math.md>), [writing](<https://devfeed.tech/tags/writing.md>)

### AI overview

The author announces four supplementary pieces for Logic for Programmers covering concurrent-process orderings, first-order logic and sets of functions, Liskov's history rule in subtyping, and orders on sets. The supplements contain roughly 2,000-3,000 words of math content and may be less polished than the book.

### Source excerpt

So I said there wasn't a proper newsletter this week, since I'm in Budapest prepping for a conference. But I still got a thing for y'all. There's a lot of interesting topics I wanted to cover for Logic for Programmers, but the book is dense enough as it is and many of these were too tangential or technical to fit in well. So I've been writing some supplements and uploading them here. I've got four so far: How we compute the number of orderings of multiple concurrent processes How first-order logic can quantify over "a set of functions", what a "set of functions" looks like, and how functions can be defined in terms of sets (plus a bit on currying and type theory) Barbara Liskov's "history rule" in subtyping Total and partial orders on sets. Now I'm going to caveat that these were written off the cuff and haven't gone through the obsessive editing of the book itself, so they may be rough and there might be errors in them. Still, it's like 2-3000 words of math content, so hopefully covers not having a proper newsletter this time. Seeya next week!

## Diagnosing a Deadlock in Trino's Hudi Connector That Stalled Blinkit's Inventory Pipeline

DevFeed: [Diagnosing a Deadlock in Trino's Hudi Connector That Stalled Blinkit's Inventory Pipeline](<https://devfeed.tech/articles/how-a-deadlock-froze-blinkit-s-supply-chain-20085.md>)

Original publisher: [Read original article](<https://lambda.blinkit.com/how-a-deadlock-froze-blinkits-supply-chain-4b7c4d6d4a3f?source=rss----42df4a1e8725---4>)

Author: Ratul Dawar

Published: 2026-05-29T09:26:27Z

Content type: article

Language: en

Sources: [Grofers](<https://devfeed.tech/sources/grofers.md>)

Topics: [Deadlock](<https://devfeed.tech/topics/deadlock.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Amazon S3](<https://devfeed.tech/topics/amazon-s3.md>)

Tags: [apache-hudi](<https://devfeed.tech/tags/apache-hudi.md>), [big-data](<https://devfeed.tech/tags/big-data.md>), [blinkit](<https://devfeed.tech/tags/blinkit.md>), [bug](<https://devfeed.tech/tags/bug.md>), [deadlock](<https://devfeed.tech/tags/deadlock.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [s3](<https://devfeed.tech/tags/s3.md>), [thread](<https://devfeed.tech/tags/thread.md>), [trino](<https://devfeed.tech/tags/trino.md>), [trinos](<https://devfeed.tech/tags/trinos.md>), [yield](<https://devfeed.tech/tags/yield.md>)

### AI overview

Blinkit describes how a deadlock in Trino's Hudi connector stalled inventory replenishment queries without errors or resource saturation. The issue involved one thread pool handling both file-split production and signalling; the reported fix used cooperative scheduling and was contributed upstream.

### Source excerpt

A silent deadlock in our query engine was stalling inventory replenishment jobs with no error, no crash -- just infinite waiting. This is the story of how we found it, traced it to an open-source bug, and fixed it upstream. TL;DRTrino's Hudi connector used a single thread pool for both producing file splits and signalling when there was room for more. Under load, every thread ended up waiting for a signal that had no thread left to run it. The fix was to switch the producer side to a cooperative scheduling pattern: yield the thread when the buffer is full, and resume when space opens. Our inventory replenishment pipeline was frozen. CPU was idle. Memory was fine. There were no errors anywhere. Queries just... stopped moving. The first signal was a long queue on one of our analytics clusters. Queries were piling up. Inventory replenishment jobs -- the jobs that decide how much stock every warehouse and store needs to hold -- were delayed. Blinkit's supply chain was being impacted. Dashboards were turning amber, but nothing was crashing. That was the unsettling part. Investigation: Resources Doing Nothing The affected cluster runs analytical workloads on Trino, reading data stored in Apache Hudi tables on S3. The natural first instinct in a queue build-up is to look at resource saturation -- a CPU spike, memory pressure, network bottleneck. There was none of that. The cluster was sitting largely idle, with CPU barely above baseline and heap usage well within limits. Every new query touching a Hudi table joined the queue and stayed there indefinitely. Queries that were already mid-execution completed fine. Only freshly submitted ones were affected. And crucially, there were no errors. No timeouts, no exceptions in the logs -- just silence and a growing backlog. A thread dump -- a snapshot of what every thread in the process is doing right now -- was our next move. It showed dozens of producer threads all stuck in the same parked state, waiting on the exact same internal signal.

## Concurrent, atomic MSI hash tables

DevFeed: [Concurrent, atomic MSI hash tables](<https://devfeed.tech/articles/concurrent-atomic-msi-hash-tables-20515.md>)

Original publisher: [Read original article](<https://nullprogram.com/blog/2026/05/06/>)

Published: 2026-05-06T02:01:17Z

Content type: tutorial

Language: en

Sources: [Chris Wellons](<https://devfeed.tech/sources/chris-wellons.md>)

Topics: [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Code](<https://devfeed.tech/topics/code.md>), [gcc](<https://devfeed.tech/topics/gcc.md>), [Processes](<https://devfeed.tech/topics/processes.md>)

Tags: [article](<https://devfeed.tech/tags/article.md>), [c](<https://devfeed.tech/tags/c.md>), [code](<https://devfeed.tech/tags/code.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [concurrent](<https://devfeed.tech/tags/concurrent.md>), [gcc](<https://devfeed.tech/tags/gcc.md>), [processes](<https://devfeed.tech/tags/processes.md>), [thread](<https://devfeed.tech/tags/thread.md>)

### AI overview

This article explains how to add atomic operations to Mask-Step-Index (MSI) hash tables so they can be accessed concurrently without data races. It covers single-producer and multiple-consumer designs, relaxed atomics, and acquire-release synchronization when published objects must be safely observed.

### Source excerpt

Readers will be familiar with Mask-Step-Index (MSI) hash tables, a technique for building fast, open-addressed hash tables in a dozen lines of code. If multiple threads or processes access an MSI table with at least one still inserting elements, care must be taken to avoid data races. This article will show how to add atomic operations to MSI tables in order to support different concurrency constraints. Let's begin with the simplest case: An integer hash set, no deletions, only one insert thread (single producer), and consumers do not care about insert order. That is, the producer inserts A then B, but consumers may observe B in the table before A. Suppose this is the hash table in the single-threaded case: int32_t *lookup(int32_t key, int32_t *table, int exp) { uint64_t hash = ((uint64_t)key * 1111111111111111111u) >> 32; uint32_t mask = ((uint32_t)1 << exp) - 1; uint32_t step = (hash >> (32 - exp)) | 1; for (uint32_t index = hash;;) { index = (index + step) & mask; if (!table[index] || table[index]==key) { return table + index; } } } Keys must be non-zero, and tables are zero-initialized. Usage example: // Initialization enum { exp = 8 }; int32_t table[1<<8] = {}; // Producer for (int i = 0; i < nkeys; i++) { *lookup(keys[i], table, exp) = keys[i]; } // Consumer int32_t key = 1234; bool present = *lookup(key, table, exp); The only problem is the data race on table slots. Since consumers can tolerate out-of-order insertions, ordering does not matter and relaxed atomics eliminate the data race. Insert and query now have different requirements, so it makes sense to distinguish them. Starting with the latter: bool contains(int32_t key, int32_t *table, int exp) { uint64_t hash = ((uint64_t)key * 1111111111111111111u) >> 32; uint32_t mask = ((uint32_t)1 << exp) - 1; uint32_t step = (hash >> (32 - exp)) | 1; for (uint32_t index = hash;;) { index = (index + step) & mask; int32_t k = __atomic_load_n(table+index, __ATOMIC_RELAXED); if (!k) { return false; } else if (k == ke

## Safe Optimistic Lock Coupling

DevFeed: [Safe Optimistic Lock Coupling](<https://devfeed.tech/articles/safe-optimistic-lock-coupling-25091.md>)

Original publisher: [Read original article](<https://databasearchitects.blogspot.com/2026/04/safe-optimistic-lock-coupling.html>)

Author: Thomas Neumann (noreply@blogger.com)

Published: 2026-04-29T10:22:56Z

Content type: article

Language: en

Sources: [Database Architects](<https://devfeed.tech/sources/database-architects.md>)

Topics: [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Data structures](<https://devfeed.tech/topics/data-structures.md>), [Scalability](<https://devfeed.tech/topics/scalability.md>), [race-condition](<https://devfeed.tech/topics/race-condition.md>)

Tags: [concurrent](<https://devfeed.tech/tags/concurrent.md>), [cpu](<https://devfeed.tech/tags/cpu.md>), [data-structures](<https://devfeed.tech/tags/data-structures.md>), [locking](<https://devfeed.tech/tags/locking.md>), [locks](<https://devfeed.tech/tags/locks.md>), [mutex](<https://devfeed.tech/tags/mutex.md>), [performance](<https://devfeed.tech/tags/performance.md>), [race-condition](<https://devfeed.tech/tags/race-condition.md>), [scalability](<https://devfeed.tech/tags/scalability.md>), [synchronization](<https://devfeed.tech/tags/synchronization.md>), [thread](<https://devfeed.tech/tags/thread.md>), [typesafety](<https://devfeed.tech/tags/typesafety.md>)

### AI overview

The article explains how lock coupling can limit the scalability of concurrent binary-tree lookups because readers contend on locks, especially at the root. It presents Optimistic Lock Coupling, in which readers validate version numbers without writes, and discusses the race-condition risk when values are used before validation.

### Source excerpt

As the number of CPU cores keeps growing, the scalability of concurrent data structures becomes increasingly important. A data structure that works fine on 4 cores can become a bottleneck on 32, not because of algorithmic limitations, but because of how it synchronizes access. We illustrate that with a simple binary tree. Usually these data structures are protected by some kind of lock: struct Node { mutex lock; key_type key; value_type value; Node* left, *right; }; struct Tree { mutex lock; Node* root; }; When searching a value, we can traverse the data structure, lock the parts of the data we are currently touching, and release locks when we are done ("lock coupling"): option<value_type> Tree::lookup(key_type key) { lock.lock_shared(); mutex* currentLock = &lock; Node* iter = root; option<value_type> result; while (iter) { if (key == iter->key) { result = iter->value; break; } Node* next = (key < iter->key) ? iter->left : iter->right; if (next) next->lock.lock_shared(); currentLock->unlock(); currentLock = next ? &next->lock : nullptr; iter = next; } currentLock->unlock(); return result; } While conceptually simple, lock coupling has quite poor performance in practice. The problem is that it creates contention on the locks, in particular for the root node. Every lookup goes through the root node, thus the root node is constantly locked and unlocked. While there is no semantic contention between lookups, as all readers can read the root concurrently, there is physical contention on the lock itself, which limits scalability. This can be seen below, with concurrent lookups in a tree of 100,000 elements, executed on a 16-core / 32-thread 9950X3D. Lookup scalability: no locking vs lock coupling This contention problem can be solved by using Optimistic Lock Coupling, a synchronization technique where readers do not perform any writes. The key idea here is that writers lock as usual, and increase a version number when they are done updating. Readers read the version numb

## How CockroachDB v26.1 Uses Elastic Admission Control and Go Scheduler Changes for Background Work

DevFeed: [How CockroachDB v26.1 Uses Elastic Admission Control and Go Scheduler Changes for Background Work](<https://devfeed.tech/articles/yields-are-up-latencies-are-down-goroutine-scheduling-in-cockroachdb-23789.md>)

Original publisher: [Read original article](<https://cockroachlabs.com/blog/goroutine-scheduling-elastic-admission-control-cockroachdb>)

Author: David Taylor

Published: 2026-04-14T00:00:00Z

Content type: article

Language: en

Sources: [Cockroach Labs](<https://devfeed.tech/sources/cockroach-labs.md>)

Topics: [CockroachDB](<https://devfeed.tech/topics/cockroachdb.md>), [Go Language](<https://devfeed.tech/topics/go-language.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Latency](<https://devfeed.tech/topics/latency.md>), [cpu](<https://devfeed.tech/topics/cpu.md>)

Tags: [background-work](<https://devfeed.tech/tags/background-work.md>), [backups](<https://devfeed.tech/tags/backups.md>), [cockroachdb](<https://devfeed.tech/tags/cockroachdb.md>), [elastic](<https://devfeed.tech/tags/elastic.md>), [latency](<https://devfeed.tech/tags/latency.md>), [processes](<https://devfeed.tech/tags/processes.md>), [statistics](<https://devfeed.tech/tags/statistics.md>), [work](<https://devfeed.tech/tags/work.md>)

### AI overview

This article explains how CockroachDB v26.1 uses elastic admission control and a change to the Go runtime scheduler to let background work use spare CPU capacity while limiting its impact on query latency.

### Source excerpt

CockroachDB runs background work -- backups, schema changes, statistics collection, changefeeds -- in the same processes that serve user queries. Traditionally, this creates a tension...

## From error-handling to structured concurrency

DevFeed: [From error-handling to structured concurrency](<https://devfeed.tech/articles/from-error-handling-to-structured-concurrency-21946.md>)

Original publisher: [Read original article](<https://blog.nelhage.com/post/concurrent-error-handling/>)

Author: Nelson Elhage

Published: 2026-03-23T15:30:00Z

Content type: opinion

Language: en

Sources: [Nelson Elhage](<https://devfeed.tech/sources/nelson-elhage.md>)

Topics: [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Error Handling](<https://devfeed.tech/topics/error-handling.md>), [Exception](<https://devfeed.tech/topics/exception.md>)

Tags: [concurrency](<https://devfeed.tech/tags/concurrency.md>), [error-handling](<https://devfeed.tech/tags/error-handling.md>), [examples](<https://devfeed.tech/tags/examples.md>), [exception](<https://devfeed.tech/tags/exception.md>), [exception-handling](<https://devfeed.tech/tags/exception-handling.md>), [structured-concurrency](<https://devfeed.tech/tags/structured-concurrency.md>)

### AI overview

This article examines how error-handling patterns based on stack unwinding and cleanup should be adapted for concurrent programs with multiple tasks. It introduces the problem of unhandled errors in concurrent execution and compares possible behaviors when one task fails.

### Source excerpt

How should we think about error-handling in concurrent programs? In single-threaded programs, we've mostly converged on a standard pattern, with a diverse zoo of implementations and concrete patterns. When an error occurs, it is propagated up the stack until we find a stack frame which is prepared to handle it. As we do so, we unwind the stack frames in-order, giving each frame the opportunity to clean up or destroy resources as appropriate.

[Next page](<https://devfeed.tech/topics/concurrent-programming.md?cursor=WyIyMDI2LTAzLTIzVDE1OjMwOjAwKzAwOjAwIiwgImRjMmViZjAwLWMwYmEtNGIwNy05YzJiLWFiYjNkOWMzZTYyMyJd>)