Snippets

Jason Kenny base example for thread pool with async in python

Created by Jason Kenny


import asyncio
from concurrent.futures import ProcessPoolExecutor
import time
import os
import functools
import types


def f(x):
    return x * x


async def factorial(name, number):
    f = 1
    for i in range(2, number + 1):
        #print("Task %s: Compute factorial(%s)..." % (name, i))
        # await asyncio.sleep(.01)
        f *= i
    print("DONE FUNC")
    return name


# def main()

def thread_main(func):
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    x = loop.run_until_complete(func())
    return x


def _done(self, func):
    self.add_done_callback(func)
    return self


def Task(func):
    pump = asyncio.get_event_loop()
    ret = pump.run_in_executor(None, thread_main, func)
    setattr(ret, "Done", types.MethodType(_done, ret))
    return ret


x = 1000


async def main():

    print("Start MAIN")

    ret = await asyncio.gather(
        Task(functools.partial(factorial, "a", x)).Done(
            lambda x: print("DONE", x.result())),
        Task(functools.partial(factorial, "b", x)),
        Task(functools.partial(factorial, "c", x)),
        Task(functools.partial(factorial, "a", x)),
        Task(functools.partial(factorial, "b", x)),
        Task(functools.partial(factorial, "c", x)),
        Task(functools.partial(factorial, "a", x)),
        Task(functools.partial(factorial, "b", x)),
        Task(functools.partial(factorial, "c", x)),
        Task(functools.partial(factorial, "a", x)),
        Task(functools.partial(factorial, "b", x)),
        Task(functools.partial(factorial, "c", x)),
        Task(functools.partial(factorial, "a", x)),
        Task(functools.partial(factorial, "b", x)),
        Task(functools.partial(factorial, "c", x)),
        Task(functools.partial(factorial, "a", x)),
        Task(functools.partial(factorial, "b", x)),
        Task(functools.partial(factorial, "c", x)),
        Task(functools.partial(factorial, "a", x)),
        Task(functools.partial(factorial, "b", x)),
        Task(functools.partial(factorial, "c", x)),
        Task(functools.partial(factorial, "a", x)),
        Task(functools.partial(factorial, "b", x)),
        Task(functools.partial(factorial, "c", x)),
        Task(functools.partial(factorial, "a", x)),
        Task(functools.partial(factorial, "b", x)),
        Task(functools.partial(factorial, "c", x)),
        Task(functools.partial(factorial, "a", x)),
        Task(functools.partial(factorial, "b", x)),
        Task(functools.partial(factorial, "c", x)),
    )

    print("Finished MAIN")
    print(ret)

if __name__ == '__main__':
    # create process/thread pool
    executor = ProcessPoolExecutor()
    # get event loop
    loop = asyncio.get_event_loop()
    # set default executor
    loop.set_default_executor(executor)
    # call func
    loop.run_until_complete(main())

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.