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())