У меня есть следующий код:
import time
import asyncio
from concurrent.futures import ProcessPoolExecutor
def blocking_func(x):
print("In blocking waiting")
time.sleep(x) # Pretend this is expensive calculations
print("after blocking waiting")
return x * 5
@asyncio.coroutine
def main():
executor = ProcessPoolExecutor()
out = yield from loop.run_in_executor(executor, blocking_func, 2) # This does not
print("after process pool")
print(out)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Выход:
In blocking waiting
after blocking waiting
after process pool
10
Но я ожидал, что пул процессов будет запускать код в другом процессе. Поэтому я ожидал, что результат будет:
Ожидаемый результат:
In blocking waiting
after process pool
after blocking waiting
10
Я думал, что если мы запустим код в пуле процессов, он не заблокирует основной цикл. Но в результате он вернулся в основной цикл событий после того, как это было сделано с функцией блокировки.
Что блокирует цикл событий? Это функция блокировки? Если это blocking_function, какая польза от наличия пула процессов?