When a request arrives intended for your application code, the App Engine frontend routes it to the application servers. If an instance of your app is running and available to receive a user request, App Engine sends the request to the instance, and the instance invokes the request handler that corresponds with the URL of the request.
If none of the running instances of the app are available, App Engine starts up a new one automatically. App Engine will also shut down instances it no longer needs. The instance is your app’s unit of computing power. It provides memory and a pro‐ cessor, isolated from other instances for both data security and performance.
Your application’s code and data stay in the instance’s memory until the instance is shut down, providing an opportunity for local storage that persists between requests. Within the instance, your application code runs in a runtime environment. The envi‐ ronment includes the language interpreter, libraries, and other environment features you selected in your app’s configuration.
Your app can also access a read-only filesys‐ tem containing its files (those that you did not send exclusively to the static file servers). The environment manages all the inputs and outputs for the request han‐ dler, setting up the request at the beginning, recording log messages during, and col‐ lecting the response at the end. If you have multithreading enabled, an instance can handle multiple requests concur‐ rently, with all request handlers sharing the same environment.
With multithreading disabled, each instance handles one request at a time. Multithreading is one of the best ways to utilize the resources of your instances and keep your costs low. But it’s up to you to make sure your request handler code runs correctly when handling multiple requests concurrently. The runtime environment and the instance are abstractions. They rest above, and take the place of, the operating system and the hardware.