LWN: Comments on "PostgreSQL reconsiders its process-based model" https://lwn.net/Articles/934940/ This is a special feed containing comments posted to the individual LWN article titled "PostgreSQL reconsiders its process-based model". en-us Fri, 17 Oct 2025 15:04:58 +0000 Fri, 17 Oct 2025 15:04:58 +0000 https://www.rssboard.org/rss-specification lwn@lwn.net PostgreSQL reconsiders its process-based model https://lwn.net/Articles/936901/ https://lwn.net/Articles/936901/ andresfreund <div class="FormattedComment"> ( "we" being the postgres project)<br> </div> Fri, 30 Jun 2023 04:24:21 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/936896/ https://lwn.net/Articles/936896/ andresfreund <div class="FormattedComment"> <span class="QuotedText">&gt; Doesn't io_uring support true async IO for filesystem access now? Maybe it would make sense to transition to that. Definitely a bit early and a risky move but it is an interesting path forward. </span><br> <p> We are working on that....<br> <p> <p> <span class="QuotedText">&gt; Of course in a database you are hoping that a lot of your data is in memory, so maybe the gains wouldn't be nearly as much as with a network service.</span><br> <p> You do also need to write data as a database and sometimes that needs to happen in the critical path (e.g. journal commits) of returning to the user. So far it doesn't seem to help a lot on high end local NVMe, but seems quite promising for typical cloud storage.<br> </div> Fri, 30 Jun 2023 01:30:36 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/936870/ https://lwn.net/Articles/936870/ kevincox <div class="FormattedComment"> Doesn't io_uring support true async IO for filesystem access now? Maybe it would make sense to transition to that. Definitely a bit early and a risky move but it is an interesting path forward. <br> <p> Of course in a database you are hoping that a lot of your data is in memory, so maybe the gains wouldn't be nearly as much as with a network service. <br> </div> Thu, 29 Jun 2023 20:48:26 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/936765/ https://lwn.net/Articles/936765/ jmscott <div class="FormattedComment"> my long answer is NO to threads.<br> <p> are we actually debating if the threaded model simplifies programming of custom data types?<br> <p> to paraphrase my dad, threaded programming is a step backwards to the days before virtual memory and not a step forward. hardware support for virtual memory revolutionized management of linear memory ... and i expect the same, new revolution when merging vector processors/GPU with postgresql.<br> <p> <p> <p> <p> </div> Thu, 29 Jun 2023 09:04:56 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/936508/ https://lwn.net/Articles/936508/ kleptog <div class="FormattedComment"> In case anyone else was briefly confused, MariaDB has both undo and redo logs. Redo logs are for error recovery, undo logs are for handling rollbacks. PostgreSQL has redo logs (aka Write Ahead Logs aka WAL), but no undo logs. It handles rollbacks via MVCC.<br> <p> Advantages of undo logs are that outdated data take no space in data files, but accessing outdated data requires special actions and can be a bottleneck for concurrency. MVCC means outdated data stays in place, so no limits on transaction size. But you need something like VACUUM to maintain performance over time.<br> <p> Actually, one of the most useful features I find with PostgreSQL is that schema changes are transactional. That makes migrations so much easier to manage since you don't have to worry about partial failure. You can run entire scripts changing tables, migrating data, altering foreign keys and if halfway something goes wrong, rollback and you're back in business. Talking to colleagues using MariaDB, schema changes always seem to be extremely painful. (Oracle doesn't support DDL in transactions either, helpfully autocommitting the transaction you were in.)<br> <p> A PostgreSQL parser on a MariaDB database feels like some kind of frankenmonster I wouldn't touch with a very long barge-pole.<br> </div> Tue, 27 Jun 2023 13:59:46 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/936465/ https://lwn.net/Articles/936465/ jhoblitt <div class="FormattedComment"> <a href="https://en.m.wikipedia.org/wiki/Redo_log">https://en.m.wikipedia.org/wiki/Redo_log</a><br> </div> Tue, 27 Jun 2023 03:15:01 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/936452/ https://lwn.net/Articles/936452/ c5h5n5o <div class="FormattedComment"> <span class="QuotedText">&gt; binary redo logs</span><br> <p> You probably meant undo logs?<br> </div> Tue, 27 Jun 2023 01:10:41 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/936176/ https://lwn.net/Articles/936176/ Lennie <div class="FormattedComment"> Seems I checked it wrong, it's the same TCP connection.<br> </div> Sat, 24 Jun 2023 11:26:30 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935946/ https://lwn.net/Articles/935946/ willmo <div class="FormattedComment"> <span class="QuotedText">&gt; when a client connects to a single database then they cannot, even if there are bugs, accidentally access data from other database.</span><br> <p> I think it depends on the bugs, and what you mean by “accidentally”. :-) I don’t think Postgres sandboxes the backend processes to protect against an attacker who gains arbitrary code execution? Still, it seems fair to assume that the practical impact of some bugs in some circumstances would be greater in a threaded model.<br> </div> Fri, 23 Jun 2023 03:01:04 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935945/ https://lwn.net/Articles/935945/ kschendel <div class="FormattedComment"> RTI the company didn't survive, but Ingres certainly did. It moved from a userland, internal-threads model to an OS/posix thread model in the late 90's, and picked up a column store execution engine alternative in the late '00's. Ingres in various incarnations is doing very well, thank you.<br> <p> </div> Fri, 23 Jun 2023 02:18:49 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935936/ https://lwn.net/Articles/935936/ andresfreund <div class="FormattedComment"> <span class="QuotedText">&gt; You do know this process can just connect to an other database ?</span><br> <span class="QuotedText">&gt; ...</span><br> <span class="QuotedText">&gt; postgres=# \c testdb</span><br> <p> That actually establishes a new connection from within psql and thus connects to a backend process. You can observe that with SELECT pg_backend_pid();.<br> </div> Fri, 23 Jun 2023 00:18:07 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935890/ https://lwn.net/Articles/935890/ Lennie <div class="FormattedComment"> You do know this process can just connect to an other database ?<br> <p> Same connection to PostgreSQL:<br> <p> postgres=# \c testdb <br> You are now connected to database "testdb" as user "postgres".<br> testdb=# <br> <p> </div> Thu, 22 Jun 2023 16:15:47 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935807/ https://lwn.net/Articles/935807/ kleptog <div class="FormattedComment"> This is a big change, I wonder how this will go. For me the process model makes it easier to convince people that when a client connects to a single database then they cannot, even if there are bugs, accidentally access data from other database. Corruption cannot "leak". In some contexts this separation is quite important. I can also imagine that hosting providers are not enthused by different customers connecting to the same cluster being mixed in a single process where.<br> <p> But nothing is final of course. There are of course benefits to be had too. But if this means I need to start managing more clusters then of course it's not helping at all. I guess it's a question of trust though in the end. And I do trust that if the postgres developers release a threaded version, then it will work as advertised.<br> <p> That said, I wonder if a hybrid scheme is possible, where you can run multiple sessions threaded in parallel in a single process but limited to a single database. Then something like pgbouncer in front of it can handle the multiplexing. You could even add restrictions like: within a single process the GUCs must be the same and they all use the same loadable objects. I feel this would solve a lot of the use-cases where they're worried about the number of simultaneous processes. OTOH might be even more complex.<br> <p> But whatever they do, the very best of luck.<br> <p> <p> <p> <p> </div> Thu, 22 Jun 2023 14:42:16 +0000 Aim for the stars https://lwn.net/Articles/935761/ https://lwn.net/Articles/935761/ khim <font class="QuotedText">&gt; PostgreSQL *is* a single process?</font> <p>Have you actually read the article? No, it's most definitely <b>not</b> a single process. They are using multiple processes, shared memory and, obviously, some locks to ensure consistency.</p> <p>Which means they <b>already</b> have locks and <b>don't need</b> GIL or BKL.</p> Thu, 22 Jun 2023 10:46:01 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935719/ https://lwn.net/Articles/935719/ eklitzke <div class="FormattedComment"> Using an event driven model doesn't really make sense for a database that needs to be portable and is doing blocking file I/O.<br> </div> Thu, 22 Jun 2023 03:48:07 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935594/ https://lwn.net/Articles/935594/ Sesse <div class="FormattedComment"> But there's a _huge_ amount of code between the parser and the storage layer. I could understand your proposal if it were “use PostgreSQL with InnoDB as the storage backend” (there are significant issues with it and it would be a large project, but at least I could understand the proposal), but not “use MariaDB with the PostgreSQL parser” (which sounds basically impossible if you ever want compatibility with real, nontrivial applications).<br> </div> Wed, 21 Jun 2023 14:49:50 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935591/ https://lwn.net/Articles/935591/ jhoblitt <div class="FormattedComment"> Of course not. I did not suggest a SQL to SQL level translational layer. It is obviously possible to reuse the psql query parser with a different backend storage engine as yugabyte has done this. See <a href="https://en.m.wikipedia.org/wiki/YugabyteDB#/media/File%3AYugabyteDBArchitecture.png">https://en.m.wikipedia.org/wiki/YugabyteDB#/media/File%3A...</a><br> </div> Wed, 21 Jun 2023 14:43:06 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935576/ https://lwn.net/Articles/935576/ Sesse <div class="FormattedComment"> But then you're surely aware that the SQL protocol and dialect is only a small fraction of that? There's no way MariaDB could ever run a Postgres extension, and it wouldn't gain any of the desired SQL features just by having a translation layer.<br> </div> Wed, 21 Jun 2023 13:59:27 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935575/ https://lwn.net/Articles/935575/ jhoblitt <div class="FormattedComment"> As I've been using both for decades and it is very common for applications to be tied to psql specific SQL features or extensions such as pgshere. Mariadb (MySQL) has long had working binary log replication, no need to fiddle with vacuuming, and doesn't require a connection pooler for non-trivial use cases. Many of these administrative concerns have gotten better on the psql side and replication is mercifully no longer a roll-your-own situation but it is still easier to scale Mariadb. The difficulty with deploying psql for non-trivial use cases is why yugabyte/etc. are gaining popularity. <br> </div> Wed, 21 Jun 2023 13:54:25 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935556/ https://lwn.net/Articles/935556/ Sesse <div class="FormattedComment"> Why do you believe that the primary thing that keeps Postgres users from moving to MariaDB is compatibility with existing code?<br> </div> Wed, 21 Jun 2023 13:01:52 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935515/ https://lwn.net/Articles/935515/ ehiggs <div class="FormattedComment"> There will of course be backpressure as you're bound by storage and cpu. And event-driven model with backpressure is basically an actor model. So I'd take your event-driven model and raise you an actor-driven model. :)<br> </div> Wed, 21 Jun 2023 09:30:32 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935429/ https://lwn.net/Articles/935429/ andresfreund <div class="FormattedComment"> <span class="QuotedText">&gt; If TLB overhead with shared memory and locks between co-operting processes is too high, why not try to fix it in kernel?</span><br> <p> I think it's not really an OS issue, but a hardware one. To avoid having to flush the TLB during context switches linux uses PCIDs on x86-64. During context switches the current the current logical cpu's pcid is updated to the the PCID of the relevant process. But a logical CPU just has a single "active" PCID. I think it's similar on ARM.<br> <p> But this is a bit outside the area I normally dabble in, so I might be misunderstanding. Or just not know about some newer hardware features linux could utilize.<br> <p> <p> <span class="QuotedText">&gt; For example, would something like opt-in sharing of pages between processes that oracle has been trying to get into kernel be the correct option: <a href="https://lwn.net/ml/linux-kernel/cover.1682453344.git.khal...">https://lwn.net/ml/linux-kernel/cover.1682453344.git.khal...</a></span><br> <p> It'd be nice to have that, to save memory on redundant page table entries for the range of mappings that is going to be the between all the processes. But I don't think it'd meaningfully improve the TLB hit rate.<br> </div> Tue, 20 Jun 2023 21:19:20 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935426/ https://lwn.net/Articles/935426/ mokki <div class="FormattedComment"> If TLB overhead with shared memory and locks between co-operting processes is too high, why not try to fix it in kernel?<br> <p> For example, would something like opt-in sharing of pages between processes that oracle has been trying to get into kernel be the correct option: <a href="https://lwn.net/ml/linux-kernel/cover.1682453344.git.khalid....">https://lwn.net/ml/linux-kernel/cover.1682453344.git.khal...</a><br> <p> Postmaster would just share the already shared memory between processes (containing also the locks). That explicit part of memory would opt-in to thread -like sharing and thus get faster/less tlb switching and lower memory usage. While all the rest of the state would still be per-process and safe.<br> <p> tl;dr super share the existing shared memory area with kernel patch<br> <p> All operating systems not supporting it would keep working as is. <br> </div> Tue, 20 Jun 2023 20:50:25 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935378/ https://lwn.net/Articles/935378/ atnot <div class="FormattedComment"> This is generally why you'll see these sorts of places run an instance of e.g. pgbouncer to pool many requests over a single process. That makes significantly more effective use of your processes, but it really doesn't solve the scaling issues.<br> </div> Tue, 20 Jun 2023 15:10:50 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935329/ https://lwn.net/Articles/935329/ rrolls <div class="FormattedComment"> A process-per-client model makes sense when you have under a thousand connected clients and they're all coming from goodness knows where: i.e. when you definitely don't want any security bugs that expose state from one client to another, or indeed allow one client to (intentionally or otherwise) cause a denial-of-service to another.<br> <p> But if you have a large number of connections coming from what is essentially the _same_ client, as we often seem to do in web services for even the simple purpose of running multiple queries at the same time, then that really shouldn't be using multiple processes.<br> <p> A threaded model works, I suppose, but an event-driven model would be far more ideal. Allow each client to connect once, and give each client its own process - but then allow that client to spawn however many asynchronous tasks it wishes and receive the results incrementally, rather than blocking the whole connection for every operation and thus requiring multiple connections. IIRC, IMAP works like this.<br> </div> Tue, 20 Jun 2023 12:00:22 +0000 Aim for the stars https://lwn.net/Articles/935330/ https://lwn.net/Articles/935330/ eru <p>&gt; <i>and it rules out entire classes of bugs.</i> <p>Seems to me this applies nicely also to PostgressSQL processes vs threads, because of the address-space separation, and the automatic memory cleanup you get when a sub-process exits. With threads, a bug in one thread may trash the memory of any other thread. Tue, 20 Jun 2023 11:56:54 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935326/ https://lwn.net/Articles/935326/ ctg <div class="FormattedComment"> This is all very deja vu.<br> <p> Back in the day, University Ingres (from which postgres, then postgresql is derived) went commercial with RTI. Version 6 was a major rewrite - going from the multi-process architecture to a multi-threaded one (and also switched to SQL as the "core" language). It wasn't that pretty. RTI didn't survive. Not saying the two things are linked. <br> <p> One of the things I like(d) about postgresql was that it still had the original multiprocess model, still recognisable from ingres of the early 1980s. <br> </div> Tue, 20 Jun 2023 11:13:37 +0000 Aim for the stars https://lwn.net/Articles/935308/ https://lwn.net/Articles/935308/ NYKevin <div class="FormattedComment"> Another part of the problem is the fact that CPython is "good enough."<br> <p> Anyone who wants to get rid of the GIL can transpile to C with Cython, annotate any objects that need to be accessed outside the GIL as C types, and then write "with nogil:" to release the GIL. It will run much faster than CPython even if you're single-threaded, and can be done incrementally on a module-by-module basis in most cases.<br> <p> The main downsides of this strategy are:<br> <p> * CPython is more mature than Cython.<br> * CPython has a (slightly) more straightforward build process, especially if you have zero non-stdlib dependencies.<br> * Cython specifically requires a C compiler.<br> * C types are not Python types. There are semantic differences. You have to do additional testing if you're converting an existing codebase.<br> * C is not a terribly complicated language, but if you don't know it at all, then you probably need to learn it first.<br> <p> But none of those are hard blockers. They're just friction. If you really strongly need to drop the GIL, this is a perfectly reasonable way of doing it. The fact is, most people asking for a GILectomy either haven't looked into alternatives like Cython, don't want free threading badly enough to overcome the activation energy of this strategy, or have already built a large CPU-bound multithreaded application in Python which is too big to annotate, despite the threading docs explicitly saying not to do that.<br> </div> Tue, 20 Jun 2023 08:13:35 +0000 Aim for the stars https://lwn.net/Articles/935283/ https://lwn.net/Articles/935283/ rtpg <div class="FormattedComment"> I would go even further, there are a good amount of people who argue for the GIL to stay in Python ~forever, mostly because the mental model is easier and it rules out entire classes of bugs.<br> <p> The GIL stuck along enough to allow for async, and so you have async for lots of parallelism in one direction, stuff like multiprocessing in the other. Even heavy calculation stuff is pretty "eh whatever" because in practice it often calls into other libraries which release the GIL.<br> <p> GILectomy work has been many many many many false starts, and I think we're learning stuff from it (and it might still be the right way to go in the end!), but it's been tough to find work from those projects that end up being usable (namely because of new locking patterns needing to be figured out in the alternative)<br> </div> Tue, 20 Jun 2023 04:44:27 +0000 Aim for the stars https://lwn.net/Articles/935284/ https://lwn.net/Articles/935284/ j16sdiz <div class="FormattedComment"> ZeroMQ is a big mess when it comes to threading model and error recovery.<br> <p> It do too much magic behind your back. When it comes to database, we need more explicit (or flexible) error handling.<br> </div> Tue, 20 Jun 2023 04:44:14 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935258/ https://lwn.net/Articles/935258/ butlerm <div class="FormattedComment"> I believe the short answer is doing that would be tantamount to the PostgreSQL project throwing away nearly everything they have done for the past couple of decades. In addition, unless MariaDB has made remarkable progress in the past few years it isn't anywhere close to implementing PostgreSQL's full feature set or in particular being able to implement those features in a backward compatible manner with PostgreSQL. <br> <p> When you get down into the details relational database implementations tend to be remarkably different from each other in terms of more user level aspects (functions, data types, options, apis) than you can count. I think it is safe to say the PostgreSQL developers have not reached quite that level of desperation yet. But if someone wanted to take that on as a software engineering challenge the results would certainly be interesting to read about.<br> </div> Mon, 19 Jun 2023 23:19:47 +0000 Aim for the stars https://lwn.net/Articles/935259/ https://lwn.net/Articles/935259/ michaelmior <div class="FormattedComment"> Postgres scales by coordinating among multiple processes on a single machine. The proposal is to use multiple threads instead of multiple processes.<br> <p> This is similar to the CPython GIL, but the GIL doesn't enforce a single process. It prevents multiple threads from running concurrently in the same process. In CPython with the GIL, multiple processes are *necessary* to scale CPU-bound code.<br> </div> Mon, 19 Jun 2023 23:18:58 +0000 Aim for the stars https://lwn.net/Articles/935254/ https://lwn.net/Articles/935254/ Wol <div class="FormattedComment"> It wasn't meant as a comparison. The Big Kernel Lock and the GIL enforced "single process". PostgreSQL *is* a single process?<br> <p> Linux and Python decided that removing that restriction was worthwhile. Whether PostgreSQL succeeds or not, the effort they make towards removing that restriction may well be worthwhile.<br> <p> Cheers,<br> Wol<br> </div> Mon, 19 Jun 2023 22:22:01 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935238/ https://lwn.net/Articles/935238/ flussence <div class="FormattedComment"> Oh this is quite some news. I don't mind early adopting performance features, but…<br> <p> In Apache httpd I've been using every experimental threaded/event mpm as it becomes available, because the forking model always felt a bit gross to me. But that's software that has had pluggable backends for decades, and even so it's still a bit rough around the edges. I generally trust the Postgres developers to not screw up but I think this kind of change would need two or three major release cycles before I'd feel comfortable turning it on in production.<br> </div> Mon, 19 Jun 2023 20:29:11 +0000 Aim for the stars https://lwn.net/Articles/935237/ https://lwn.net/Articles/935237/ nevyn <div class="FormattedComment"> Python GIL and Linux Big kernel lock seem like very bad comparisons. In those cases there is/was no Parallelism, here there is Parallelism but _maybe_ the scaling is better if you change "everything" and _maybe_ the security/robustness is the same.<br> <p> This is "closer" to the apache-httpd move, the main difference being I don't know enough about PostgreSQL and the plans to move to imply the outcome will be that bad.<br> </div> Mon, 19 Jun 2023 20:19:19 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935232/ https://lwn.net/Articles/935232/ pizza <div class="FormattedComment"> <span class="QuotedText">&gt; Semi-seriously, why not port the postgresql sql dialect to use mariadb as the backend? Mariadb (mysql...) has had a robust threaded model and binary redo logs for literally decades.</span><br> <p> Because it's not Postgresql's "dialect" that matters here, but rather the features and robustness that dialect exposes.<br> <p> ...Mariadb might as well be on another planet in comparison.<br> <p> <p> </div> Mon, 19 Jun 2023 19:48:21 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935231/ https://lwn.net/Articles/935231/ jhoblitt <div class="FormattedComment"> Semi-seriously, why not port the postgresql sql dialect to use mariadb as the backend? Mariadb (mysql...) has had a robust threaded model and binary redo logs for literally decades.<br> </div> Mon, 19 Jun 2023 19:45:04 +0000 PostgreSQL reconsiders its process-based model https://lwn.net/Articles/935225/ https://lwn.net/Articles/935225/ raven667 <div class="FormattedComment"> I know nothing of the PostgreSQL internals or the relevant engineering but throwing an opinion out there anyway; is there a way to make a minimal threaded implementation that just covers the necessary features needed for the most extreme large servers where threading could help? If you made a ton of caveats about what features are supportable, ie anything not used by the large instances you want test with, can you reduce the scope of what work is needed to something more manageable that can be iterated on? Steady improvement without taking on a big chunk of risk to rework the whole internal architecture, even if it takes longer, is probably the way to go for an old mature software project like this, right?<br> </div> Mon, 19 Jun 2023 19:26:16 +0000 Aim for the stars https://lwn.net/Articles/935219/ https://lwn.net/Articles/935219/ zoobab <div class="FormattedComment"> Maybe yse zeromq ipc messages between threads?<br> </div> Mon, 19 Jun 2023 18:18:59 +0000 Aim for the stars https://lwn.net/Articles/935194/ https://lwn.net/Articles/935194/ Wol <div class="FormattedComment"> <span class="QuotedText">&gt; While the outcome of the discussion suggests that most PostgreSQL developers think that this change is good in the abstract, there are also clearly concerns about how it would work in practice.</span><br> <p> And you might hit the moon. Aim nowhere and you're going nowhere.<br> <p> Look at the GIL (was that Python?) and the Big Kernel Lock in linux. Whether you get there or not, a lot of the work on the way sounds like it's worth it in its own right. Like getting rid of all those global variables!<br> <p> Even being able to break up each process into a bunch of threads for the easy stuff could lead to massive benefits - threading where it works well, processes where they work well.<br> <p> I wish you all God Speed on the voyage!<br> <p> Cheers,<br> Wol<br> </div> Mon, 19 Jun 2023 16:11:25 +0000