Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как победить гонку в Pool при выводе?

Алексей Евдокимов Мастер (1632), открыт 3 недели назад
 import multiprocessing as mp 
import time


def foo_pool(x):
time.sleep(2)
print(f'Task {x} executing with {mp.current_process().name}', flush=True)
return x * x


result_list = []


def log_result(result):
result_list.append(result)


def apply_async_with_callback():
pool = mp.Pool(2)
for i in range(10):
pool.apply_async(foo_pool, args=(i, ), callback=log_result)
pool.close()
pool.join()
print(result_list)


if __name__ == '__main__':
apply_async_with_callback()

Думал использовать lock, но функция вообще перестала отрабатывать. И ошибок не выдает.

 import multiprocessing as mp 
import time


def foo_pool(x, lock):
time.sleep(2)
try:
print(f'Task {x} executing with {mp.current_process().name}', flush=True)
return x * x
finally:
lock.release()


result_list = []


def log_result(result):
result_list.append(result)


def apply_async_with_callback():
lock = mp.Lock()
pool = mp.Pool(2)
for i in range(10):
pool.apply_async(foo_pool, args=(i, lock), callback=log_result)
pool.close()
pool.join()
print(result_list)


if __name__ == '__main__':
apply_async_with_callback()

Видимо есть какой-то нюанс.
Дополнен 3 недели назад
Видимо тут два вопроса:
1) Как принципиально победить разрыв на первом скрине?
2) Почему перестало отрабатывать во втором варианте?
Дополнен 3 недели назад
во 2 коде перед try пропустил lock.acquire()
Дополнен 3 недели назад
Добавил error_callback, отловил "Lock objects should only be shared between processes through inheritance". Буду копать сюда.
Дополнен 3 недели назад
Решено, использовал общий объект синхронизации lock = mp.Manager().Lock()
0 ответов
Похожие вопросы