Chris Angelico <ros...@gmail.com>: > And I don't remember how Java did things, except that I struggled to > find basic fundamental primitives like semaphores, and had to use > synchronized functions/objects instead.
Java now has a diverse set of synchornization facilities, but the builtin object synchronization produces excellent idioms and is usually preferred (by me). Java also has rigorously defined its multithreaded data model (the Happens-Before Relation). Java's threads have two major problems: * The classic I/O forced you to dedicate a thread for each communication context (connection) because there was no multiplexing facility and because the sockets were blocking (and buffered IIRC). The thread proliferation caused serious scalability issues. Latter-day Java's NIO framework addresses this shortcoming to a great degree, but even that is a surprisingly tricky beast to program for -- it suffers from builtin race conditions. * There is no way to interrupt a thread -- except in Solaris! You can mark a thread for interruption and there is an associated exception but they are not guaranteed to be provided by JVM. And then there's the inherent problems of thread programming: * Deadlocks. * Missing synchronization. which in practice are just too hard for mortals. I've seen it. I've been complicit. Now, when it comes to Python, asyncio is its answer to Java's NIO. It seeks to provide a cross-platform Way to Life, Universe and Everything. A commendable objective. Unfortunately, I find the coroutine approach artificial and unintuitive in practice. Select.epoll(EPOLLET) plus a timer implementation easily beats it (as long as you can limit yourself to linux). Marko -- https://mail.python.org/mailman/listinfo/python-list