Thank you Andre, The fact that one of the bottlenecks is in waiting for the database to get the data back is what I was targeting. If LC just sends a request to a different program, and that program spawns a new thread for each request, then LC is free to keep working. In this way, LC would be single-threaded and handling database activities asynchronously.
It appears this can be done with using asynchronous http requests sent to a database program with an http plugin, but that seems weird and clunky to me. Just to clarify, I am not trying to multithread with LC or use multiple processes with LC. I am wondering about using multithreading in an external that then sends search results back to LC as they become available. LC would still be single-threaded in this scenario. The end result is that LC keeps working while the database is handling multiple searches. Sent from my iPhone > On Dec 5, 2017, at 9:40 AM, Andre Garzia <an...@andregarzia.com> wrote: > > Jonathan, > > It is not that simple. There is no silver bullet that can be added to a > language to make it scale by couple orders of magnitude like this. LiveCode > engine while is executing your business logic is not doing anything else (it > might be tidying up the house bit, I haven't looked at it but it is > definitely not executing other parts of your business code). Other languages > with support of fibers/coroutines can basically switch what they are doing > like an OS with multithreading without actually the threading part. Some > other languages support full threads and some even allow you to fork(). But > as far as I am aware LC datatypes and workflow is not thread safe (someone > familiar with the internals might correct me here) which makes it a time bomb > if you go spawning threads. Also thread programming is quite complex and data > races are a real problem, Mozilla creation of Rust was in-parts to prevent > data races with a safer language, thats how big this problem is, people go > and create new languages to solve it. > > LC bottleneck is not database queries, the queries spend more time inside the > database than they do in transit between the revdb external and the rdbms. > There is not something that we can bolt on top of the current LC engine to > make it behave like nodejs (non-blocking with async language and jit) and > that is not even desirable. NodeJS programming requires a ton of tooling and > knowledge that is not at all related to whatever business you're trying to > solve, LC is much more a pick and go language than NodeJS ever will be. Doing > a simple setup of a modern NodeJS sample based on server-side rendering and > react will probably download hundreds of megabytes in developer dependencies, > just to get the sample to compile. Imagine if one of your stacks required > THOUSANDS of little stacks that amounted to HUNDREDS of megabytes on disk, > just to load. That is the land of NodeJS, it has its own problems. > > Other potential solutions for deploying LC based server software have been > attempted in the past, I will summarize two of them below as > food-for-thoughts. > > ## THE FASTCGI APPROACH ## > Long long time ago, in a Runtime Revolution far far away, I coded a fastcgi > stack. Fastcgi is a protocol specification that allows using a single > connection (or a pool) to multiplex requests from a server. So using > something like a persistent TCP connection to Apache, you could answer > multiple requests. The problem with fastcgi and LC is the same as outlined > above, while the cgi part was trying to solve something, it would not respond > to requests, thats the bottleneck: the blocking code part. Imagine that your > cgi needs to fetch a large data set from a file and process it before > answering and that this process took 5 seconds. During those seconds, the > server would be unresponsive. > > ## THE ENGINE POOL ## > I believe it was Richard who did this, can't recall, it was definitely not > me. Keep a pool of engines running, lets say 20, use a node balancer to round > robin them. This allows you to answer at least 20 concurrent requests. Then > engine pool is only desirable over our normal CGI method in one very specific > case: The current LC server is CGI based, so it spawns a new engine for each > request, if you're on a memory constrained machine that can't afford this > escalation of memory and cpu usage, you keep a pool of engines in a safe > threshold and use the pool. I can only see this working well on a raspberry > pi, all other cases CGI should work better. > > ## Curiosity nuggets of semi-related trivia ## > Oh, and sometimes even NodeJS is slow, check out this article I wrote couple > weeks ago: http://andregarzia.com/en/blog/creating-rust-based-nodejs-modules > in which I show a dramatic speedup in a NodeJS codebase by converting the > most critical part of the code into a Rust based module. The code used to > execute in 3 seconds and went to execute in 150 miliseconds. > > >> On Tue, Dec 5, 2017 at 9:29 AM, Jonathan Lynch via use-livecode >> <use-livecode@lists.runrev.com> wrote: >> To make this happen, it seems like we would need an external that >> multithreads database queries and sends the query results back to LC as a >> new message. It would have to bring in a new ID for each request and return >> that ID with the result. >> >> Can the ODBC external do that? >> >> Sent from my iPhone >> >> > On Dec 4, 2017, at 2:06 PM, Richard Gaskin via use-livecode >> > <use-livecode@lists.runrev.com> wrote: >> > >> > jonathandlynch wrote: >> > >> > > Hi Richard and Andre - thanks for your replies. I was the one who >> > > mentioned millions of users at the same time, not out of drunkenness >> > > but because I wanted to understand the upper limits of these systems. >> > >> > Scaling is a fascinating problem. I found the C10k problem a good >> > starting point (in recent years supplanted with C10m): >> > >> > <https://en.wikipedia.org/wiki/C10k_problem> >> > >> > >> > > I also found a thread discussing this idea from a few years ago that >> > > Richard was part of. It was very informative. >> > >> > I usually just quote Pierre or Andre, but once in a while my OCD habits >> > with benchmarking add something useful. :) >> > >> > >> > > I think an all-LC very fast server would be a great thing, but it >> > > sounds like just using node would be more realistic. I might fiddle >> > > a bit with this idea, just to satisfy my curiosity. >> > >> > Node.js is good where Node.js is needed. In some cases NginX is good. In >> > other cases Lighttpd is fine. And in many cases Apache is fine, even with >> > simple CGI. >> > >> > Most of us never need to think about C10m, or even C10k. If we do, that's >> > a wonderfully fortunate problem to have. Just having that problem makes >> > it much easier to get funding to solve it with specialists. Let the >> > t-shirts sort it out while the suits focus on strategy. >> > >> > -- >> > Richard Gaskin >> > Fourth World Systems >> > Software Design and Development for the Desktop, Mobile, and the Web >> > ____________________________________________________________________ >> > ambassa...@fourthworld.com http://www.FourthWorld.com >> > >> > _______________________________________________ >> > use-livecode mailing list >> > use-livecode@lists.runrev.com >> > Please visit this url to subscribe, unsubscribe and manage your >> > subscription preferences: >> > http://lists.runrev.com/mailman/listinfo/use-livecode >> >> _______________________________________________ >> use-livecode mailing list >> use-livecode@lists.runrev.com >> Please visit this url to subscribe, unsubscribe and manage your subscription >> preferences: >> http://lists.runrev.com/mailman/listinfo/use-livecode > > > > -- > http://www.andregarzia.com -- All We Do Is Code. > http://fon.nu -- minimalist url shortening service. _______________________________________________ use-livecode mailing list use-livecode@lists.runrev.com Please visit this url to subscribe, unsubscribe and manage your subscription preferences: http://lists.runrev.com/mailman/listinfo/use-livecode