The role of the map(), starmap(), and apply() functions is to allocate work to a subprocess in the Pool object and then collect the response from the subprocess when that response is ready. This can cause the child to wait for the parent to gather the results. The _async() function's variations do not wait for the child to finish. These functions return an object that can be queried to get the individual results from the child processes.
The following is a variation using the map_async() method:
import multiprocessing pattern = "*.gz" combined = Counter() with multiprocessing.Pool() as workers: results = workers.map_async( analysis, glob.glob(pattern)) data = results.get() ...