<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: concurrency</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/concurrency.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-08-03T18:57:56+00:00</updated><author><name>Simon Willison</name></author><entry><title>From Async/Await to Virtual Threads</title><link href="https://simonwillison.net/2025/Aug/3/virtual-threads/#atom-tag" rel="alternate"/><published>2025-08-03T18:57:56+00:00</published><updated>2025-08-03T18:57:56+00:00</updated><id>https://simonwillison.net/2025/Aug/3/virtual-threads/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://lucumr.pocoo.org/2025/7/26/virtual-threads/"&gt;From Async/Await to Virtual Threads&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Armin Ronacher has long been critical of async/await in Python, both for necessitating &lt;a href="https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/"&gt;colored functions&lt;/a&gt; and because of the more subtle challenges they introduce like &lt;a href="https://lucumr.pocoo.org/2020/1/1/async-pressure/"&gt;managing back pressure&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Armin &lt;a href="https://lucumr.pocoo.org/2024/11/18/threads-beat-async-await/"&gt;argued convincingly&lt;/a&gt; for the threaded programming model back in December. Now he's expanded upon that with a description of how virtual threads might make sense in Python.&lt;/p&gt;
&lt;p&gt;Virtual threads behave like real system threads but can vastly outnumber them, since they can be paused and scheduled to run on a real thread when needed. Go uses this trick to implement goroutines which can then support millions of virtual threads on a single system.&lt;/p&gt;
&lt;p&gt;Python core developer Mark Shannon &lt;a href="https://discuss.python.org/t/add-virtual-threads-to-python/91403"&gt;started a conversation&lt;/a&gt; about the potential for seeing virtual threads to Python back in May.&lt;/p&gt;
&lt;p&gt;Assuming this proposal turns into something concrete I don't expect we will see it in a production Python release for a few more years. In the meantime there are some exciting improvements to the Python concurrency story - most notably &lt;a href="https://docs.python.org/3.14/whatsnew/3.14.html#whatsnew314-pep734"&gt;around sub-interpreters&lt;/a&gt; - coming up this year in Python 3.14.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/armin-ronacher"&gt;armin-ronacher&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gil"&gt;gil&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/go"&gt;go&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/threads"&gt;threads&lt;/a&gt;&lt;/p&gt;



</summary><category term="armin-ronacher"/><category term="concurrency"/><category term="gil"/><category term="go"/><category term="python"/><category term="threads"/></entry><entry><title>This month in Servo: parallel tables and more</title><link href="https://simonwillison.net/2024/Jul/31/servo-parallel-tables/#atom-tag" rel="alternate"/><published>2024-07-31T15:03:28+00:00</published><updated>2024-07-31T15:03:28+00:00</updated><id>https://simonwillison.net/2024/Jul/31/servo-parallel-tables/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://servo.org/blog/2024/07/31/this-month-in-servo/"&gt;This month in Servo: parallel tables and more&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
New in Servo:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Parallel table layout&lt;/strong&gt; is now enabled (&lt;a href="https://github.com/mrobinson"&gt;@mrobinson&lt;/a&gt;, &lt;a href="https://github.com/servo/servo/pull/32477"&gt;#32477&lt;/a&gt;), spreading the work for laying out rows and their columns over all available CPU cores. This change is a great example of the strengths of &lt;a href="https://crates.io/crates/rayon"&gt;Rayon&lt;/a&gt; and the opportunistic parallelism in Servo's layout engine.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;a href="https://github.com/servo/servo/commit/e16291f14edc38d4bc3663a36619e6e461329402?diff=unified&amp;amp;w=0"&gt;commit landing the change&lt;/a&gt; is quite short, and much of the work is done by refactoring the code to use &lt;code&gt;.par_iter().enumerate().map(...)&lt;/code&gt; - &lt;a href="https://docs.rs/rayon/latest/rayon/iter/index.html"&gt;par_iter()&lt;/a&gt; is the Rayon method that allows parallel iteration over a collection using multiple threads, hence multiple CPU cores.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://www.phoronix.com/news/Servo-Multi-Core-HTML-Tables"&gt;Phoronix&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/html"&gt;html&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rust"&gt;rust&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/servo"&gt;servo&lt;/a&gt;&lt;/p&gt;



</summary><category term="concurrency"/><category term="html"/><category term="rust"/><category term="servo"/></entry><entry><title>Free-threaded CPython is ready to experiment with!</title><link href="https://simonwillison.net/2024/Jul/12/free-threaded-cpython/#atom-tag" rel="alternate"/><published>2024-07-12T23:42:46+00:00</published><updated>2024-07-12T23:42:46+00:00</updated><id>https://simonwillison.net/2024/Jul/12/free-threaded-cpython/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://labs.quansight.org/blog/free-threaded-python-rollout"&gt;Free-threaded CPython is ready to experiment with!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The Python 3.13 beta releases that include a "free-threaded" version that removes the GIL are now available to test! A team from Quansight Labs, home of the PyData core team, just launched &lt;a href="https://py-free-threading.github.io/"&gt;py-free-threading.github.io&lt;/a&gt; to help document the new builds and track compatibility with Python's larger ecosystem.&lt;/p&gt;
&lt;p&gt;Free-threading mode will not be enabled in Python installations by default. You can install special builds that have the option enabled today - I used the macOS installer and, after enabling the new build in the "Customize" panel in the installer, ended up with a &lt;code&gt;/usr/local/bin/python3.13t&lt;/code&gt; binary which shows "Python 3.13.0b3 experimental free-threading build" when I run it.&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://til.simonwillison.net/python/trying-free-threaded-python"&gt;my TIL describing my experiments so far&lt;/a&gt; installing and running the 3.13 beta on macOS, which also includes a correction to an embarrassing bug that Claude introduced but I failed to catch!


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gil"&gt;gil&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/threads"&gt;threads&lt;/a&gt;&lt;/p&gt;



</summary><category term="concurrency"/><category term="gil"/><category term="python"/><category term="threads"/></entry><entry><title>Real Multithreading is Coming to Python - Learn How You Can Use It Now</title><link href="https://simonwillison.net/2023/May/15/per-interpreter-gils/#atom-tag" rel="alternate"/><published>2023-05-15T19:42:39+00:00</published><updated>2023-05-15T19:42:39+00:00</updated><id>https://simonwillison.net/2023/May/15/per-interpreter-gils/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://martinheinz.dev/blog/97"&gt;Real Multithreading is Coming to Python - Learn How You Can Use It Now&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Martin Heinz provides a detailed tutorial on trying out the new Per-Interpreter GIL feature that’s landing in Python 3.12, which allows Python code to run concurrently in multiple threads by spawning separate sub-interpreters, each with their own dedicated GIL.&lt;/p&gt;

&lt;p&gt;It’s not an easy feature to play with yet! First you need to compile Python yourself, and then use APIs that are generally only available to C code (but should hopefully become available to Python code itself in Python 3.13).&lt;/p&gt;

&lt;p&gt;Martin’s workaround for this is ingenious: it turns out the Python test.support package provides utility functions to help write tests against interpreters, and Martin shows how to abuse this module to launch, run and cleanup interpreters using regular Python code.&lt;/p&gt;

&lt;p&gt;He also demonstrates test.support.interpreters.create_channel(), which can be used to create channels with receiver and sender ends, somewhat similar to Go.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://lobste.rs/s/i9wbjm/real_multithreading_is_coming_python"&gt;lobste.rs&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gil"&gt;gil&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/go"&gt;go&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="concurrency"/><category term="gil"/><category term="go"/><category term="python"/></entry><entry><title>PEP 554 – Multiple Interpreters in the Stdlib: Shared data</title><link href="https://simonwillison.net/2022/Sep/20/shared-data/#atom-tag" rel="alternate"/><published>2022-09-20T01:25:51+00:00</published><updated>2022-09-20T01:25:51+00:00</updated><id>https://simonwillison.net/2022/Sep/20/shared-data/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://peps.python.org/pep-0554/#shared-data"&gt;PEP 554 – Multiple Interpreters in the Stdlib: Shared data&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Python 3.12 hopes to introduce multiple interpreters as part of the Python standard library, so Python code will be able to launch subinterpreters, each with their own independent GIL. This will allow Python code to execute on multiple CPU cores at the same time while ensuring existing code (and C modules) that rely on the GIL continue to work.&lt;/p&gt;

&lt;p&gt;The obvious question here is how data will be shared between those interpreters. This PEP proposes a channels mechanism, where channels can be used to send just basic Python types between interpreters: None, bytes, str, int and channels themselves (I wonder why not floats?)

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=32906085#32906395"&gt;theandrewbailey on Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pep"&gt;pep&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="concurrency"/><category term="pep"/><category term="python"/></entry><entry><title>The GIL and its effects on Python multithreading</title><link href="https://simonwillison.net/2021/Sep/29/the-gil-and-its-effects-on-python-multithreading/#atom-tag" rel="alternate"/><published>2021-09-29T17:23:15+00:00</published><updated>2021-09-29T17:23:15+00:00</updated><id>https://simonwillison.net/2021/Sep/29/the-gil-and-its-effects-on-python-multithreading/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://tenthousandmeters.com/blog/python-behind-the-scenes-13-the-gil-and-its-effects-on-python-multithreading/"&gt;The GIL and its effects on Python multithreading&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Victor Skvortsov presents the most in-depth explanation of the Python Global Interpreter Lock I’ve seen anywhere. I learned a ton from reading this.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=28690560"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gil"&gt;gil&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/threads"&gt;threads&lt;/a&gt;&lt;/p&gt;



</summary><category term="concurrency"/><category term="gil"/><category term="python"/><category term="threads"/></entry><entry><title>Can Scala gain wider usage than Java any time soon?</title><link href="https://simonwillison.net/2012/Feb/11/can-scala-gain-wider/#atom-tag" rel="alternate"/><published>2012-02-11T17:17:00+00:00</published><updated>2012-02-11T17:17:00+00:00</updated><id>https://simonwillison.net/2012/Feb/11/can-scala-gain-wider/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Can-Scala-gain-wider-usage-than-Java-any-time-soon/answer/Simon-Willison"&gt;Can Scala gain wider usage than Java any time soon?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No, because Scala is harder to master than Java.&lt;/p&gt;

&lt;p&gt;(By "master" I mean get to the point where you can read and understand code written by someone else, no matter what language features and idioms they are using)&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/java"&gt;java&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/programming"&gt;programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/scala"&gt;scala&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/scaling"&gt;scaling&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="concurrency"/><category term="java"/><category term="programming"/><category term="scala"/><category term="scaling"/><category term="web-development"/><category term="quora"/></entry><entry><title>What server do I need to handle 1000+ users simultaneously while they can post messages, upload pictures, and other similar stuff on a website based on PHP and mySQL?</title><link href="https://simonwillison.net/2012/Jan/10/what-server-do-i/#atom-tag" rel="alternate"/><published>2012-01-10T09:37:00+00:00</published><updated>2012-01-10T09:37:00+00:00</updated><id>https://simonwillison.net/2012/Jan/10/what-server-do-i/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/What-server-do-I-need-to-handle-1000+-users-simultaneously-while-they-can-post-messages-upload-pictures-and-other-similar-stuff-on-a-website-based-on-PHP-and-mySQL/answer/Simon-Willison"&gt;What server do I need to handle 1000+ users simultaneously while they can post messages, upload pictures, and other similar stuff on a website based on PHP and mySQL?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You don't need to handle 1,000 users simultaneously: you need to build something and ship it and start the process of discovering what you can build that will attract that many users. Seriously: don't even start worrying about that kind of scale until you know you're going to need it.&lt;/p&gt;

&lt;p&gt;(That said, there's no harm in keeping scaling issues in mind while you're building the software - try to avoid making dumb architectural decisions that will be impossible to scale later. But deciding on your 1,000+ simultaneous user serving architecture before you've Built Something People Want is a huge waste of your time).&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nodejs"&gt;nodejs&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tornado"&gt;tornado&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webservers"&gt;webservers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="concurrency"/><category term="nodejs"/><category term="tornado"/><category term="webservers"/><category term="quora"/></entry><entry><title>Distributed lock on top of memcached</title><link href="https://simonwillison.net/2010/Feb/1/distributed/#atom-tag" rel="alternate"/><published>2010-02-01T10:15:02+00:00</published><updated>2010-02-01T10:15:02+00:00</updated><id>https://simonwillison.net/2010/Feb/1/distributed/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://amix.dk/blog/post/19386"&gt;Distributed lock on top of memcached&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A simple Python context manager (taking advantage of the with statement) that implements a distributed lock using memcached to store lock state: “memcached_lock can be used to ensure that some global data is only updated by one server”. Redis would work well for this kind of thing as well.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/contextmanager"&gt;contextmanager&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/locking"&gt;locking&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/memcached"&gt;memcached&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/plurk"&gt;plurk&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/redis"&gt;redis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/with"&gt;with&lt;/a&gt;&lt;/p&gt;



</summary><category term="concurrency"/><category term="contextmanager"/><category term="locking"/><category term="memcached"/><category term="plurk"/><category term="python"/><category term="redis"/><category term="with"/></entry><entry><title>dustin's gomemcached</title><link href="https://simonwillison.net/2009/Nov/13/gomemcached/#atom-tag" rel="alternate"/><published>2009-11-13T15:13:45+00:00</published><updated>2009-11-13T15:13:45+00:00</updated><id>https://simonwillison.net/2009/Nov/13/gomemcached/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://github.com/dustin/gomemcached"&gt;dustin&amp;#x27;s gomemcached&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A memcached server written in Go, an experiment by memcached maintainer Dustin Sallings.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://dustin.github.com/2009/11/12/gomemcached.html"&gt;Hello World in Go&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dustin-sallings"&gt;dustin-sallings&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/go"&gt;go&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/memcached"&gt;memcached&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/programming"&gt;programming&lt;/a&gt;&lt;/p&gt;



</summary><category term="concurrency"/><category term="dustin-sallings"/><category term="go"/><category term="memcached"/><category term="programming"/></entry><entry><title>The Go Programming Language</title><link href="https://simonwillison.net/2009/Nov/11/go/#atom-tag" rel="alternate"/><published>2009-11-11T07:00:21+00:00</published><updated>2009-11-11T07:00:21+00:00</updated><id>https://simonwillison.net/2009/Nov/11/go/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://golang.org/"&gt;The Go Programming Language&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A brand new systems programming language, designed by Robert Griesemer and Unix/Plan 9 veterans Rob Pike and Ken Thompson and funded by Google. Concurrency is supported by lightweight communicating processes called goroutines. “It feels like a dynamic language but has the speed and safety of a static language.”


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/go"&gt;go&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/goroutines"&gt;goroutines&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ken-thompson"&gt;ken-thompson&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/plan9"&gt;plan9&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/programming"&gt;programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/robert-griesemer"&gt;robert-griesemer&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rob-pike"&gt;rob-pike&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/unix"&gt;unix&lt;/a&gt;&lt;/p&gt;



</summary><category term="concurrency"/><category term="go"/><category term="google"/><category term="goroutines"/><category term="ken-thompson"/><category term="plan9"/><category term="programming"/><category term="robert-griesemer"/><category term="rob-pike"/><category term="unix"/></entry><entry><title>Testing Django Views for Concurrency Issues</title><link href="https://simonwillison.net/2009/May/27/testing/#atom-tag" rel="alternate"/><published>2009-05-27T10:01:08+00:00</published><updated>2009-05-27T10:01:08+00:00</updated><id>https://simonwillison.net/2009/May/27/testing/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.caktusgroup.com/blog/2009/05/26/testing-django-views-for-concurrency-issues/"&gt;Testing Django Views for Concurrency Issues&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Neat decorator for executing a Django view under high concurrency in your unit tests, to help spot errors caused by database race conditions that should be executed inside a transaction.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/raceconditions"&gt;raceconditions&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/testing"&gt;testing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/threads"&gt;threads&lt;/a&gt;&lt;/p&gt;



</summary><category term="concurrency"/><category term="django"/><category term="python"/><category term="raceconditions"/><category term="testing"/><category term="threads"/></entry><entry><title>A Curious Course on Coroutines and Concurrency</title><link href="https://simonwillison.net/2009/Apr/24/coroutines/#atom-tag" rel="alternate"/><published>2009-04-24T10:58:42+00:00</published><updated>2009-04-24T10:58:42+00:00</updated><id>https://simonwillison.net/2009/Apr/24/coroutines/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.dabeaz.com/coroutines/index.html"&gt;A Curious Course on Coroutines and Concurrency&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
David Beazley’s sequel to last year’s mind-expanding “Generator Tricks for System Programmers”, perfect for if you’ve ever puzzled over what exactly you can use Python’s generator-based coroutine support for.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/coroutines"&gt;coroutines&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/david-beazley"&gt;david-beazley&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generators"&gt;generators&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="concurrency"/><category term="coroutines"/><category term="david-beazley"/><category term="generators"/><category term="python"/></entry><entry><title>django-springsteen and Distributed Search</title><link href="https://simonwillison.net/2009/Feb/25/springsteen/#atom-tag" rel="alternate"/><published>2009-02-25T22:28:25+00:00</published><updated>2009-02-25T22:28:25+00:00</updated><id>https://simonwillison.net/2009/Feb/25/springsteen/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://lethain.com/entry/2009/feb/25/django-springsteen-and-distributed-search/"&gt;django-springsteen and Distributed Search&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Will Larson’s Django search library currently just talks to Yahoo! BOSS, but is designed to be extensible for other external search services. Interestingly, it uses threads to fire off several HTTP requests in parallel from within the Django view.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangospringsteen"&gt;djangospringsteen&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/http"&gt;http&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/search"&gt;search&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/threads"&gt;threads&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/will-larson"&gt;will-larson&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/yahoo-boss"&gt;yahoo-boss&lt;/a&gt;&lt;/p&gt;



</summary><category term="concurrency"/><category term="django"/><category term="djangospringsteen"/><category term="http"/><category term="python"/><category term="search"/><category term="threads"/><category term="will-larson"/><category term="yahoo-boss"/></entry><entry><title>Mac OS X Leopard:  Multicore</title><link href="https://simonwillison.net/2007/Jun/11/apple/#atom-tag" rel="alternate"/><published>2007-06-11T23:02:07+00:00</published><updated>2007-06-11T23:02:07+00:00</updated><id>https://simonwillison.net/2007/Jun/11/apple/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.apple.com/macosx/leopard/technology/multicore.html"&gt;Mac OS X Leopard:  Multicore&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
“... NSOperation, a breakthrough new API that optimizes applications for the world of multicore processing.”


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/concurrency"&gt;concurrency&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/leopard"&gt;leopard&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/macos"&gt;macos&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/multicore"&gt;multicore&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nsoperation"&gt;nsoperation&lt;/a&gt;&lt;/p&gt;



</summary><category term="concurrency"/><category term="leopard"/><category term="macos"/><category term="multicore"/><category term="nsoperation"/></entry></feed>