Как я могу использовать Pool.join () при использовании контекста? - PullRequest
0 голосов
/ 08 мая 2019

Вот простой рабочий:

def mycube(x):
    print('start {}'.format(x))
    time.sleep(1)
    print('end {}'.format(x))
    return x**3

Конечно, мы можем использовать старый способ:

def test_apply_async0c():
    results=[]
    pool = multiprocessing.Pool(5)
    [pool.apply_async(mycube, args=(x,), callback=lambda x: results.append(x)) for x in range(1, 7)]
    pool.close()
    pool.join()
    print('all done!')

Или использовать новый способ, но не делать обратный вызов:

def test_apply_async0():
    with multiprocessing.Pool(5) as pool:
        results = [pool.apply_async(mycube, args=(x,)) for x in range(1, 7)]
        print([_res.get() for _res in results])
    print('all done!')

Однако, я не могу использовать контекст с pool.join, и контекст не включается автоматически, есть ли в любом случае, я могу сказать контексту присоединиться, прежде чем выйти из области видимости?

def test_apply_async0b():
    results=[]
    with multiprocessing.Pool(5) as pool:
        [pool.apply_async(mycube, args=(x,), callback=lambda x: results.append(x)) for x in range(1, 7)]
        pool.join() # this does not work since the pool has not close yet?
    print('all done!')
...