Вот простой рабочий:
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!')