Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does an asynchronous call always create/call a new thread?

Does asynchronous call always create a new thread?

Example:

If JavaScript is single threaded then how can it do an async postback? Is it actually blocking until it gets a callback? If so, is this really an async call?

like image 569
Ted Smith Avatar asked Feb 28 '09 18:02

Ted Smith


People also ask

Is asynchronous always multithreaded?

Async programming is about non-blocking execution between functions, and we can apply async with single-threaded or multithreaded programming. So, multithreading is one form of asynchronous programming.

Does an asynchronous method work on a separate thread?

No, it does not. It MAY start another thread internally and return that task, but the general idea is that it does not run on any thread.

How do asynchronous calls work?

Asynchronous. Asynchronous calls do not block (or wait) for the API call to return from the server. Execution continues on in your program, and when the call returns from the server, a “callback” function is executed.

Is async same as threading?

Asyncio vs threading: Async runs one block of code at a time while threading just one line of code at a time. With async, we have better control of when the execution is given to other block of code but we have to release the execution ourselves.


1 Answers

This is an interesting question.

Asynchronous programming is a paradigm of programming that is principally single threaded, i.e. "following one thread of continuous execution".

You refer to javascript, so lets discuss that language, in the environment of a web browser. A web browser runs a single thread of javascript execution in each window, it handles events (such as onclick="someFunction()") and network connections (such as xmlhttprequest calls).

<script> function performRequest() {   xmlhttp.open("GET", "someurl", true);   xmlhttp.onreadystatechange = function() {     if (xmlhttp.readyState == 4) {       alert(xmlhttp.responseText);     }   }   xmlhttp.send(sometext); } </script> <span onclick="performRequest()">perform request</span> 

(This is a nonworking example, for demonstration of concepts only).

In order to do everything in an asynchronous manner, the controlling thread has what is known as a 'main loop'. A main loop looks kind of like this:

while (true) {     event = nextEvent(all_event_sources);     handler = findEventHandler(event);     handler(event); } 

It is important to note that this is not a 'busy loop'. This is kind of like a sleeping thread, waiting for activity to occur. Activity could be input from the user (Mouse Movement, a Button Click, Typing), or it could be network activity (The response from the server).

So in the example above,

  1. When the user clicks on the span, a ButtonClicked event would be generated, findEventHandler() would find the onclick event on the span tag, and then that handler would be called with the event.
  2. When the xmlhttp request is created, it is added to the all_event_sources list of event sources.
  3. After the performRequest() function returns, the mainloop is waiting at the nextEvent() step waiting for a response. At this point there is nothing 'blocking' further events from being handled.
  4. The data comes back from the remote server, nextEvent() returns the network event, the event handler is found to be the onreadystatechange() method, that method is called, and an alert() dialog fires up.

It is worth noting that alert() is a blocking dialog. While that dialog is up, no further events can be processed. It's an eccentricity of the javascript model of web pages that we have a readily available method that will block further execution within the context of that page.

like image 123
Jerub Avatar answered Sep 29 '22 11:09

Jerub