What is the difference between pool.imap_unordered() and pool.apply_async()?
When pool.imap_unordered() is preferred over pool.apply_async() or vice versa?
The result of calling pool.apply_async(f, (1, 2, 3, 4)) is that f(1, 2, 3, 4) will be called in some thread.  The value returned by apply_async is an AsyncResult which you can use to wait on the result.
The result of calling pool.imap_unordered(f, (1, 2, 3, 4)) is an iterator.  It returns the results of f(1), f(2), f(3) and f(4) is an unspecified order.
What is the difference between pool.imap_unordered() and pool.apply_async()?