I've been using gevent for 12+ years in a large codebase that uses it everwhere. It's wonderful, and I'm totally spoiled by how well it interoperates with code that wasn't designed to be async (especially library code that I don't want to refactor before using). There's no boilerplate. It takes no time to teach new people, and rarely do they even need to understand how async even works to write the correct code. I think it's a shame that asyncio became the defacto approach from cpython, because it would have been so much better for the ecosystem if cpython blessed gevent as the recommended approach. Still, gevent continues to be the best solution today and beyond.