@mdev

Как правильно сделать добавление в список из Pool.map?

Всем привет

Не так давно сел за Питон, впечатляет, но пока попадаются головоломные моменты.
Подскажите, пожалуйста, правильное решение для такой задачи.

Нужно запустить несколько процессов, которые добавляют в список cards[] произвольное количество записей.

import time
import os
from multiprocessing import Process, Pool

def add_card(card):
	print('*** 1 ***' + str(card))
	pid = os.getpid()
	card.append( {'id': 7, 'descr': pid})
	time.sleep(1)
	print('*** 2 ***' + str(card))
	return (card,)

if __name__ == '__main__':
	cards=[]
	cards.append( {'id': 1, 'descr': 'Первый'})
	cards.append( {'id': 2, 'descr': 'Второй'})
	cards.append( {'id': 3, 'descr': 'Третий'})
	cards.append( {'id': 4, 'descr': 'Четвертый'})
	cards.append( {'id': 5, 'descr': 'Пятый'})
	cards.append( {'id': 6, 'descr': 'Шестой'})
	print('*** NEW ***' + str(cards))


#Запускаем 3 процесса, на входе даем список из трех кортежей (cards,)

with Pool(3) as p:
    p.map(add_card, (cards,)*3 )

print('*** FIN ***' + str(cards))


Результат:
*** NEW ***[{'id': 1, 'descr': 'Первый'}, {'id': 2, 'descr': 'Второй'}, {'id': 3, 'descr': 'Третий'}, {'id': 4, 'descr': 'Четвертый'}, {'id': 5, 'descr': 'Пятый'}, {'id': 6, 'descr': 'Шестой'}]

*** 1 ***[{'id': 1, 'descr': 'Первый'}, {'id': 2, 'descr': 'Второй'}, {'id': 3, 'descr': 'Третий'}, {'id': 4, 'descr': 'Четвертый'}, {'id': 5, 'descr': 'Пятый'}, {'id': 6, 'descr': 'Шестой'}]

*** 2 ***[{'id': 1, 'descr': 'Первый'}, {'id': 2, 'descr': 'Второй'}, {'id': 3, 'descr': 'Третий'}, {'id': 4, 'descr': 'Четвертый'}, {'id': 5, 'descr': 'Пятый'}, {'id': 6, 'descr': 'Шестой'}, {'id': 7, 'descr': 15048}]

*** 1 ***[{'id': 1, 'descr': 'Первый'}, {'id': 2, 'descr': 'Второй'}, {'id': 3, 'descr': 'Третий'}, {'id': 4, 'descr': 'Четвертый'}, {'id': 5, 'descr': 'Пятый'}, {'id': 6, 'descr': 'Шестой'}]

*** 2 ***[{'id': 1, 'descr': 'Первый'}, {'id': 2, 'descr': 'Второй'}, {'id': 3, 'descr': 'Третий'}, {'id': 4, 'descr': 'Четвертый'}, {'id': 5, 'descr': 'Пятый'}, {'id': 6, 'descr': 'Шестой'}, {'id': 7, 'descr': 17432}]

*** 1 ***[{'id': 1, 'descr': 'Первый'}, {'id': 2, 'descr': 'Второй'}, {'id': 3, 'descr': 'Третий'}, {'id': 4, 'descr': 'Четвертый'}, {'id': 5, 'descr': 'Пятый'}, {'id': 6, 'descr': 'Шестой'}]

*** 2 ***[{'id': 1, 'descr': 'Первый'}, {'id': 2, 'descr': 'Второй'}, {'id': 3, 'descr': 'Третий'}, {'id': 4, 'descr': 'Четвертый'}, {'id': 5, 'descr': 'Пятый'}, {'id': 6, 'descr': 'Шестой'}, {'id': 7, 'descr': 17732}]

*** FIN ***[{'id': 1, 'descr': 'Первый'}, {'id': 2, 'descr': 'Второй'}, {'id': 3, 'descr': 'Третий'}, {'id': 4, 'descr': 'Четвертый'}, {'id': 5, 'descr': 'Пятый'}, {'id': 6, 'descr': 'Шестой'}]


А хотелось бы чтобы к списку cards в теле запущенных процессов добавлялись новые записи.
Предложите правильную идею плз
  • Вопрос задан
  • 51 просмотр
Пригласить эксперта
Ответы на вопрос 1
obezh
@obezh
Python разработчик
with Pool(3) as p:
    result = p.map(add_card, (cards,)*3 )
print(result)

А в def add_card убрать принты
Особенности форматирования и вывода прописать в add_card любым удобным вариантом, по итогу его и return в функции)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы