A tale of concurrency through creativity in Python: a deep dive into how gevent works

  • gevent usa greenlets (corotinas ou, goroutines em go) ao invés de threads do sistema operacional.
    • Essas operações são colaborativas, portanto elas precisam ceder (yield) a execução para outras rotinas.
    • Por serem apenas rotinas no programa, sem intervenção do sistema operacional, são mais leves.
  • Interessante como a biblioteca em C gevent resolve o problema.
    • A biblioteca manipula a stack/heap para dar continuidade em uma rotina que deceu a execução.
  • libev foi usada para manipular o loop de eventos e controlar a execução das greenlets
  • Com monkey patching é possível tornar um código síncrono em assíncrono.
    • Possível porque gevent troca socket bloqueante por não bloqueante.
    • Porém só funciona para biblioteca em python.
      • Se estiver usando uma biblioteca de banco de dados em C com wrapper em python, não vai funcionar.
    • Só funciona para I/O, rotinas que precisam de muita CPU não fazem muito sentido rodar com greenlets (provavelmente que threads sejam um modelo melhor).
  • Deve haver colaboração entre as rotinas, se uma delas não ceder a execução para que as demais continuem quando estiverem prontas, não haverá concorrência, apenas uma rotina continua.