Add sayncio_patch.py.md
This commit is contained in:
parent
7c24134897
commit
77f57ba977
66
sayncio_patch.py.md
Normal file
66
sayncio_patch.py.md
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
# AsyncPatch
|
||||||
|
|
||||||
|
# A mixin written by me to use to enable async on all your non async classes! It's not only a patch to use it but actually really executes the code in the event loop!
|
||||||
|
|
||||||
|
## How to use
|
||||||
|
```python
|
||||||
|
|
||||||
|
# (C) retoor 2024-12-01
|
||||||
|
|
||||||
|
import os
|
||||||
|
import AsyncioPatch from asyncio_patch.py
|
||||||
|
|
||||||
|
# Non async traditional class.
|
||||||
|
class Reader:
|
||||||
|
|
||||||
|
def readline(self):
|
||||||
|
return os.stdin.readline()
|
||||||
|
|
||||||
|
# Extend the class with the mixin.
|
||||||
|
class AsyncReader(Reader, AsyncioPatch):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Use it for blocking code.
|
||||||
|
async def main():
|
||||||
|
reader = AsyncReader()
|
||||||
|
|
||||||
|
# method 1
|
||||||
|
print(await reader.areadline())
|
||||||
|
|
||||||
|
# method 2
|
||||||
|
print(await reader.readline_async())
|
||||||
|
|
||||||
|
asyncio.run(main())
|
||||||
|
```
|
||||||
|
|
||||||
|
## Source code
|
||||||
|
```python
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
class AsyncioPatch:
|
||||||
|
def __getattr__(self, name):
|
||||||
|
if name.endswith("_async"):
|
||||||
|
name = name.split("_async")[0]
|
||||||
|
elif name.startswith("a"):
|
||||||
|
name = name[1:]
|
||||||
|
else:
|
||||||
|
return self.__dict__.get(name, None)
|
||||||
|
return self.patch_async(getattr(self, name))
|
||||||
|
|
||||||
|
|
||||||
|
def patch_async(self, method, *args, **kwargs):
|
||||||
|
async def patched_async(*args, **kwargs):
|
||||||
|
loop = asyncio.get_running_loop()
|
||||||
|
import functools
|
||||||
|
patched_call = functools.partial(method, *args, **kwargs)
|
||||||
|
return await loop.run_in_executor(None, patched_call)
|
||||||
|
return patched_async
|
||||||
|
|
||||||
|
async def __aenter__(self):
|
||||||
|
fn = self.patch_async(self.__enter__)
|
||||||
|
return await fn()
|
||||||
|
|
||||||
|
async def __aexit__(self, *args, **kwargs):
|
||||||
|
fn = self.patch_async(self.__exit__,*args, **kwargs)
|
||||||
|
return await fn()
|
||||||
|
```
|
Loading…
Reference in New Issue
Block a user