<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/releasing-execution-contexts-e78jjyq7b" -->

---
title: Releasing Execution Contexts | daily.dev
description: Crystal language introduces Execution Contexts, a new multithreading model replacing the legacy 'preview MT' scheduler. Three context types are provided:...
canonical: https://daily.dev/posts/releasing-execution-contexts-e78jjyq7b
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Releasing Execution Contexts | daily.dev
og:description: Crystal language introduces Execution Contexts, a new multithreading model replacing the legacy 'preview MT' scheduler. Three context types are provided:...
og:url: https://daily.dev/posts/releasing-execution-contexts-e78jjyq7b
og:image: https://api.daily.dev/og/posts/e78jjyQ7B.png
og:image:alt: Releasing Execution Contexts
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Releasing Execution Contexts

**[Crystal](https://daily.dev/sources/crystallang)** · 8 min read · 1 upvotes · 0 comments

## Summary

Crystal language introduces Execution Contexts, a new multithreading model replacing the legacy 'preview MT' scheduler. Three context types are provided: Concurrent (fibers run concurrently on one thread), Parallel (fibers scale across CPU cores with work stealing), and Isolated (a single fiber owns a dedicated thread). The default context starts concurrent on one thread to avoid breaking existing apps, but can be resized for parallelism. Key breaking changes include fibers being able to switch threads in parallel contexts, schedulers moving threads on blocking syscalls like getaddrinfo, and removal of the spawn(same_thread: true) argument. The new scheduler is faster than all legacy schedulers and auto-scales to CPU cores roughly every 100ms. Legacy preview_mt and without_mt flags remain temporarily supported but are discouraged.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://crystal-lang.org/2026/07/12/releasing-execution-contexts>

## Questions this post answers

### What breaking changes come with Crystal's new execution contexts replacing preview MT?

Fibers can now switch threads at runtime, schedulers can migrate to another thread on blocking syscalls like getaddrinfo, and the spawn(same_thread: true) argument is no longer supported in parallel contexts and raises an exception at runtime. The CRYSTAL_WORKERS environment variable is no longer used automatically. Legacy behavior remains available via the without_mt or preview_mt compilation flags, though continued support isn't guaranteed.

_Developers upgrading Crystal apps off preview MT can track breaking changes like these via daily.dev._

### How do I resize the default execution context in Crystal to enable parallelism?

Call Fiber::ExecutionContext.default.resize(maximum: System.cpu_count) to let the default context automatically scale fibers across CPU cores at runtime. By default the context is parallel but capped at a parallelism of 1, so fibers run concurrently on a single thread until resized, avoiding breaking changes for applications not yet ready for multithreading.

_Anyone tuning Crystal's concurrency model can follow changes like this on daily.dev._

### What is the difference between Concurrent, Parallel, and Isolated execution contexts in Crystal?

Concurrent contexts run fibers concurrently but never in parallel with each other; Parallel contexts run fibers concurrently and in parallel, auto-scaling across CPU cores via work stealing; Isolated contexts dedicate a single system thread to one fiber for its entire lifetime, letting it block freely without affecting the rest of the application.

_Developers choosing a concurrency model for Crystal apps can compare options like these on daily.dev._

## Similar posts on daily.dev

- [Crystal 1.21.0 is released\!](https://daily.dev/posts/crystal-1-21-0-is-released--rdiw9bdey) · Crystal · 19 upvotes · 0 comments
- [Virtual Threads After JDK 24: What Changed for Production Java](https://daily.dev/posts/virtual-threads-after-jdk-24-what-changed-for-production-java-1iad53gy7) · InfoQ · 0 upvotes · 0 comments
- [SBCL Fibers: Lightweight Cooperative Threads](https://daily.dev/posts/sbcl-fibers-lightweight-cooperative-threads-zzn5jtjaa) · Hacker News · 0 upvotes · 0 comments

---

[View this post on daily.dev](https://daily.dev/posts/releasing-execution-contexts-e78jjyq7b)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Releasing Execution Contexts","url":"https://daily.dev/posts/releasing-execution-contexts-e78jjyq7b","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/releasing-execution-contexts-e78jjyq7b"},"datePublished":"2026-07-12T14:22:48.489Z","dateModified":"2026-09-13T18:50:29.056Z","description":"Crystal language introduces Execution Contexts, a new multithreading model replacing the legacy 'preview MT' scheduler. Three context types are provided:...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/c616608edce46f1578c8899503fb7d4a?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/c616608edce46f1578c8899503fb7d4a?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Crystal","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Crystal","logo":"https://media.daily.dev/image/upload/s--7bam2lrQ--/f_auto/v1734606444/logos/crystallang","url":"https://daily.dev/sources/crystallang"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/releasing-execution-contexts-e78jjyq7b","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"","timeRequired":"PT8M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Crystal","item":"https://daily.dev/sources/crystallang"},{"@type":"ListItem","position":3,"name":"Releasing Execution Contexts"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/releasing-execution-contexts-e78jjyq7b#faq","mainEntity":[{"@type":"Question","name":"What breaking changes come with Crystal's new execution contexts replacing preview MT?","acceptedAnswer":{"@type":"Answer","text":"Fibers can now switch threads at runtime, schedulers can migrate to another thread on blocking syscalls like getaddrinfo, and the spawn(same_thread: true) argument is no longer supported in parallel contexts and raises an exception at runtime. The CRYSTAL_WORKERS environment variable is no longer used automatically. Legacy behavior remains available via the without_mt or preview_mt compilation flags, though continued support isn't guaranteed. Developers upgrading Crystal apps off preview MT can track breaking changes like these via daily.dev."}},{"@type":"Question","name":"How do I resize the default execution context in Crystal to enable parallelism?","acceptedAnswer":{"@type":"Answer","text":"Call Fiber::ExecutionContext.default.resize(maximum: System.cpu_count) to let the default context automatically scale fibers across CPU cores at runtime. By default the context is parallel but capped at a parallelism of 1, so fibers run concurrently on a single thread until resized, avoiding breaking changes for applications not yet ready for multithreading. Anyone tuning Crystal's concurrency model can follow changes like this on daily.dev."}},{"@type":"Question","name":"What is the difference between Concurrent, Parallel, and Isolated execution contexts in Crystal?","acceptedAnswer":{"@type":"Answer","text":"Concurrent contexts run fibers concurrently but never in parallel with each other; Parallel contexts run fibers concurrently and in parallel, auto-scaling across CPU cores via work stealing; Isolated contexts dedicate a single system thread to one fiber for its entire lifetime, letting it block freely without affecting the rest of the application. Developers choosing a concurrency model for Crystal apps can compare options like these on daily.dev."}}]}
```

