Support both asyncio and synchronous callers

Damian Johnson atagar1 at gmail.com
Sat Jul 25 21:36:03 EDT 2020


Hi. I'm the author of Stem, Tor's python library [1]. Recently we
migrated to asyncio, but desire to still be usable by synchronous
callers.

We wrote a mixin [2][3] that transparently makes any class usable by
both asyncio and synchronous callers...

======================================================================

import asyncio
import stem.util.asyncio

class Example(stem.util.asyncio.Synchronous):
  async def hello(self):
    return 'hello'

def sync_demo():
  instance = Example()
  print('%s from a synchronous context' % instance.hello())
  instance.stop()

async def async_demo():
  instance = Example()
  print('%s from an asynchronous context' % await instance.hello())
  instance.stop()

sync_demo()
asyncio.run(async_demo())

======================================================================

Is there a better way to approach this?

Our wider ecosystem seem to be forking networking libraries into
sync/async variants, with requests [4] and AIOHTTP [5] as the most
prominent. Are there any libraries out there that demonstrate good
support for both kinds of callers without duplicating their API?

Thanks! -Damian

PS. I apologize if this email gets duplicated. Initially I used a
different email address which Mailman seemed to decline.

[1] https://stem.torproject.org/
[2] https://gitweb.torproject.org/stem.git/tree/stem/util/asyncio.py
[3] https://gitweb.torproject.org/stem.git/tree/test/unit/util/asyncio.py
[4] https://requests.readthedocs.io/en/master/
[5] https://docs.aiohttp.org/en/latest/index.html


More information about the Python-list mailing list