profilers.py 806 B

123456789101112131415161718192021222324252627282930313233
  1. from pathlib import Path
  2. import dramatiq
  3. import yappi
  4. __all__ = ["ProfilerMiddleware"]
  5. PROFILE_DIR = "var"
  6. class ProfilerMiddleware(dramatiq.Middleware):
  7. """For usage with dramatiq (single-threaded only)"""
  8. def __init__(self, profile_dir: Path):
  9. profile_dir.mkdir(exist_ok=True)
  10. self.profile_dir = profile_dir
  11. def before_process_message(self, broker, message):
  12. yappi.set_clock_type("wall")
  13. yappi.start()
  14. def after_process_message(
  15. self, broker, message: dramatiq.Message, *, result=None, exception=None
  16. ):
  17. yappi.stop()
  18. stats = yappi.convert2pstats(yappi.get_func_stats())
  19. stats.dump_stats(
  20. self.profile_dir / f"{message.actor_name}-{message.message_id}.pstats"
  21. )
  22. yappi.clear_stats()