Guest User

Untitled

a guest
Aug 28th, 2020
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.70 KB | None | 0 0
  1. import asyncio
  2. from functools import wraps, partial
  3.  
  4. import sqlalchemy
  5. from sqlalchemy.orm import sessionmaker
  6. from sqlalchemy.ext.declarative import declarative_base
  7.  
  8. loop = asyncio.get_event_loop()
  9.  
  10. engine = sqlalchemy.create_engine(
  11.     "sqlite:///data.db"
  12. )
  13. Base = declarative_base()
  14. Session = sessionmaker(engine)
  15.  
  16.  
  17. class SessionPool:
  18.     def __init__(self, size=10):
  19.         self.sessions = asyncio.queues.Queue(size)
  20.  
  21.         for _ in range(size):
  22.             self.sessions.put_nowait(Session())
  23.  
  24.     def async_with_alchemy(self, f):
  25.         @wraps(f)
  26.         async def ghosting_session(*args, **kwargs):
  27.             loop = asyncio.get_running_loop()
  28.             partial_func = partial(f, *args, **kwargs)
  29.  
  30.             async def execute_function():
  31.                 session = await self.sessions.get()
  32.                 result = await loop.run_in_executor(None, partial_func, session)
  33.                 await self.sessions.put(session)
  34.  
  35.                 return result
  36.  
  37.             return await execute_function()
  38.         return ghosting_session
  39.  
  40.  
  41. session_pool = SessionPool()
  42.  
  43.  
  44. class DemoUser(Base):
  45.     id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
  46.     name = sqlalchemy.Column(sqlalchemy.String)
  47.  
  48.     __tablename__ = "users"
  49.  
  50.     @classmethod
  51.     @session_pool.async_with_alchemy
  52.     def init_data(cls, session):
  53.         users = [
  54.             DemoUser(name="Rud"), DemoUser(name="Tester"), DemoUser(name="Someone else")
  55.         ]
  56.  
  57.         session.commit()
  58.         return users
  59.  
  60.  
  61. async def example():
  62.     users = DemoUser.init_data()
  63.     users2 = DemoUser.init_data()
  64.     await users
  65.     await users
  66.     print(users)
  67.  
  68.  
  69. loop.run_until_complete(example())
Advertisement
Add Comment
Please, Sign In to add comment