QUESTION 4:
Another performance upgrade would be to add concurrency/parallelism where possible to increase the performance of the system.
One example of this, in example_system_1, is that a single-threaded system will wait for the result of
action_get_logs1() before calling action_get_logs2() (or vice versa).
However these functions are independent of eachother and could be executed in parallel, speeding up the system.
Complete the "get_output_value_with_caching_and_parallelism" below, using concurrency/parallelism anywhere possible to
increase the performance of the system.
Your selection of parallelization primitive or library does not affect your score
(eg, you may use multithreading, multiprocessing, asyncio, etc)
You can assume that there is no performance overhead for additional workers
(eg, you have unlimited CPUs), and that all action functions are IO-bound.
Extra for experts: limit the number of CPU cores you have to N, and assume each action can utilize
a fixed number of CPUs from 1 to N. Then schedule parallel actions such that CPU cores
are optimally utilized (but not oversaturated).