Using other C libraries

Obviously you can still use any C library of your choice to do you the job.

Conclusion

Almost each of the presented solutions have their own specific applications and are not really interchangeable. The solution that is going to be the best for most of the projects is simply spawning threads, even though they have a quite big overhead, if the application doesn't have hundred of threads running at the same time, it should largely do the job.

async/await is a great feature, but since it is not supported anymore it is cleary not a viable option at the moment.

libuv might be the solution if the needed application is single-threaded and leverages non-blocking sockets, particulary useful for servers that have to handle massive loads of IO operations.

zigcoro might be the way to go if you plan on using async/await in the future, since it has almost the same features the migration should be quite easy.

Sources: