This is about async I/O, which is very relevant if your program is
I/O-bound. If it is CPU-bound, then the things get different and real
multi-threading might provide an answer.
The optimal solution depends a lot on the concrete task and the
properties of the available hardware. For example, nowadays some tasks
are best accomplished by GPU-s (which are not directly related to
neither async I/O nor to what is commonly called multithreading).
A general advice: if you have no experience in the area, there is not
much point in striving to the most effective solution the first time,
you will not achieve that anyway. Instead, you should try to develop a
decent, correctly working program, preferably multiple programs using
different approaches if possible, for comparison. The time to focus on
top performance will come maybe after some 5 years when you have
gathered enough experience.