Search code examples
pythonpython-asynciocoroutinefunction-call

How to execute a function call in asyncio python


I am trying to call some functions through asyncio. I was following http://www.giantflyingsaucer.com/blog/?p=5557 this tutorial. It doesn't talk about how to call other functions.

import asyncio


    def print_myname():
        return ("My name is xyz")

    def print_myage():
        return ("My age is 21")


    @asyncio.coroutine
    def my_coroutine(future, task_name, function_call):
        print("Task name", task_name)
        data = yield from function_call
        #yield from asyncio.get_function_source(function_call)  #I was trying this too
        future.set_result(data)


    def got_result(future):
        return future.result()


    loop = asyncio.get_event_loop()
    future1 = asyncio.Future()
    future2 = asyncio.Future()

    tasks = [
        my_coroutine(future1, 'name', print_myname()),
        my_coroutine(future2, 'age', print_myage())]

    name = future1.add_done_callback(got_result)
    age = future2.add_done_callback(got_result)

    loop.run_until_complete(asyncio.wait(tasks))
    loop.close()

    print ("name output", name)
    print ("age output", age)

It throws a runtime error that it is not able to yield.

Task exception was never retrieved

    future: <Task finished coro=<my_coroutine() done, defined at /home/user/Desktop/testproject/source//weather/async_t.py:11> exception=RuntimeError("Task got bad yield: 'M'",)>
    Traceback (most recent call last):
        result = coro.throw(exc)
      File "/home/user/Desktop/testproject/source/weather/async_t.py", line 14, in my_coroutine
        data = yield from function_call
    RuntimeError: Task got bad yield: 'M'

Through the exception it seems that it has gone to the function, but unable to execute the code.


Solution

  • To call a regular function, just call it. You can not yield from a regular function - just from a coroutine.

    Instead of:

    data = yield from foo()
    

    Just use:

    data = foo()