Asynchronous IO with gevent vs. concurrent.futures.ThreadedPool
I'm working on a program where the main bottleneck is network io. I originally implemented concurrent.futures.ThreadedPool to speed up the process. It turns out there is a better asynchronous io module for my use case, though gevent. Profile results:
Results for concurrent.futures.ThreadPool:
5319963 function calls (5318875 primitive calls) in 359.541 seconds Ordered by: internal time List reduced from 872 to 50 due to restriction <50> ncalls tottime percall cumtime percall filename:lineno(function) 31 349.876 11.286 349.876 11.286 {method 'acquire' of '_thread.lock' objects} 2652 3.293 0.001 3.293 0.001 {method 'recv' of '_socket.socket' objects} 310270 0.790 0.000 0.790 0.000 {method 'timetuple' of 'datetime.date' objects} 25 0.661 0.026 0.661 0.026 {method 'recv_into' of '_socket.socket' objects}
Results for gevent fork (https://github.com/fantix/gevent):
7645675 function calls (7153156 primitive calls) in 301.813 seconds Ordered by: internal time List reduced from 948 to 50 due to restriction <50> ncalls tottime percall cumtime percall filename:lineno(function) 107541/4418 281.228 0.003 296.499 0.067 gevent/hub.py:354(wait) 99885/59883 4.466 0.000 405.922 0.007 gevent/_socket3.py:248(recv) 99097 2.244 0.000 2.244 0.000 {method 'write' of '_io.BufferedWriter' objects} 111125/2796 1.036 0.000 0.017 0.000 gevent/hub.py:345(switch) 107543/2788 1.000 0.000 0.039 0.000 gevent/hub.py:575(get)

















