# def announce_server(task=None, loop=None, **outer_kwargs): # if task is None: # return lambda f: announce_server(f, loop=loop, **outer_kwargs) # @wraps(task) # def wrapper(*args, **kwargs): # async def main(*args, **kwargs): # if loop is not None: # host_block_thread = loop.run_in_executor(None, task) # else: # host_block_thread = asyncio.to_thread(task) # python 3.9+ # # Announce the server to the host # await _announce_server(**outer_kwargs) # # Wait for host_block to finish # await host_block_thread # if loop is not None: # task = loop.create_task(main(*args, **kwargs)) # else: # task = asyncio.run(main(*args, **kwargs)) # return task # return wrapper # def announce_server(task=None, loop=None, **outer_kwargs): # if task is None: # return lambda f: announce_server(f, loop=loop, **outer_kwargs) # @wraps(task) # async def wrapper(*args, **kwargs): # if not asyncio.iscoroutinefunction(task): # # If the decorated function is not a coroutine, wrap it in a coroutine # task = asyncio.coroutine(task) # if loop is not None: # host_block_thread = loop.run_in_executor(None, task) # else: # host_block_thread = asyncio.to_thread(task) # # Announce the server to the host # await _announce_server(**outer_kwargs) # # Wait for host_block to finish # await host_block_thread # return wrapper # def announce_server(task=None, loop=None, **outer_kwargs): # if task is None: # return lambda f: announce_server(f, loop=loop, **outer_kwargs) # if loop is None: # loop = asyncio.get_event_loop() # @wraps(task) # def wrapper(*args, **kwargs): # async def main(*args, **kwargs): # if asyncio.iscoroutinefunction(task): # # If the task is async, just await it # host_block_thread = task(*args, **kwargs) # else: # host_block_thread = loop.run_in_executor(None, task, *args, **kwargs) # # Announce the server to the host # await _announce_server(**outer_kwargs) # # Wait for host_block to finish # await host_block_thread # task = loop.create_task(main(*args, **kwargs)) # return task # return wrapper