Skip to content

Instantly share code, notes, and snippets.

@jsbueno
Created June 14, 2024 04:45
Show Gist options
  • Save jsbueno/1b9a191a519b0fb1f577a8501e7c1e8a to your computer and use it in GitHub Desktop.
Save jsbueno/1b9a191a519b0fb1f577a8501e7c1e8a to your computer and use it in GitHub Desktop.
POC: wrapper for a function that can either run sychrnously or be awaited in an asyncio context:
# here, the function that can work "either way" is the nested "payload".
# The external ^morphix_in_thread" can be a decorator, and "payload" the decorated function
def morphix_in_thread():
try:
loop = asyncio.get_running_loop()
except RuntimeError:
loop = None
def payload():
time.sleep(1.5)
return 5
if not loop:
return payload()
f = asyncio.Future()
async def apayload():
return await loop.run_in_executor(None, payload)
task = loop.create_task(apayload())
task.add_done_callback(lambda t: f.set_result(t.result()))
return f
"""
In [97]: async def main():
...: return await morphix_in_thread()
...:
In [98]: asyncio.run(main())
Out[98]: 5
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment