У меня есть dict
, который я хочу поделиться с 4 процессами, которые изменяют значения в этом dict
в режиме реального времени. Файл dict создается с помощью Manager().dict()
Вопрос в том, нужно ли блокировать ресурс каждый раз, когда процесс изменяет dict
? Что делать, если 4 обрабатывает доступ к этому dict
в режиме реального времени?доля dict между процессом
ответ
Тогда вы увидите неопределенное поведение. Вот простой тест программы:
def worker(t):
d, i = t
d[i % 10] += 1
if __name__ == "__main__":
import multiprocessing as mp
pool = mp.Pool()
d = mp.Manager().dict()
for i in range(10):
d[i] = 0
pool.map(worker, ((d, i) for i in xrange(1000)))
pool.close()
pool.join()
print d, sum(d.values())
А вот пример вывода из 3-х серий:
{0: 97, 1: 96, 2: 98, 3: 96, 4: 96, 5: 99, 6: 97, 7: 96, 8: 96, 9: 94} 965
{0: 97, 1: 97, 2: 96, 3: 97, 4: 97, 5: 97, 6: 95, 7: 95, 8: 93, 9: 96} 960
{0: 98, 1: 97, 2: 98, 3: 96, 4: 97, 5: 95, 6: 97, 7: 97, 8: 97, 9: 98} 970
Чтобы получить «ожидаемый» отсчет 100 в каждом ведре, вам нужно создать mp.Manager().Lock()
объект слишком, передать его и использовать в worker()
для защиты мутации dict.
Вместо того, блокировка в рабочем ящике явно может быть проще подкласса 'multiprocessing.managers.DictProxy' и wrap' _callmethod() 'в блокировке/разблокировке, а затем зарегистрировать новый тип в' SyncManager' как 'syncDict' или что-то в этом роде. я действительно удивлен, что нет фабрики или чего-то еще для создания синхронизированных управляемых объектов ... –
Я согласен, это означает, что пользователи должны заботиться о блокировке каждый раз, когда хотят разделить состояние между процессом! – nam
Это наверняка , но многопроцессорность работает точно так же, как и многопоточность в этом отношении, за исключением того, что гораздо более дорогостоящее разделение состояния между процессами, чем поперечные нити. Как это сделать, после добавления всего кода блокировки, по крайней мере, вы будете знать *, почему ваш многопроцессорный код работает медленнее, чем свинец с 1 ногой ;-) –
- 1. Доля сложного объекта с другим процессом
- 2. share dict между процессами
- 3. Доля объектов между подсистемами
- 4. Доля общего между чертами
- 5. Доля секундомера между потоками
- 6. Доля кода между классами
- 7. Доля переменных между проектами
- 8. Доля компонентов между 2
- 9. Доля памяти между банками
- 10. Связь между дочерним процессом и родительским процессом
- 11. связь между родительским процессом и дочерним процессом
- 12. Разница между процессом Daemon и сиротским процессом?
- 13. Доля памяти в Windows_7 между различными сеансами
- 14. Доля объектов только для чтения между процессами
- 15. Разница между не dict и not dict == {}
- 16. Доля области между представлениями/контроллером
- 17. Доля свойств между несколькими классами
- 18. Доля переменной между процессами - PHP
- 19. Доля ресурсов между картой/уменьшением
- 20. Доля объекта между пользователями django
- 21. Доля потоковой мьютекс между процессами
- 22. React Доля переменных между компонентами
- 23. Доля основных данных между приложениями
- 24. Доля экземпляра между несколькими проектами
- 25. Доля объектов между несколькими проектами
- 26. Доля функции области между контроллерами
- 27. Доля значений между несколькими преобразованиями?
- 28. Разница между процессом и сервисом?
- 29. Erlang Сообщение, проходящее между процессом
- 30. Почему нет переключения между процессом
тогда у вас будут условия гонки ... скорее всего ... это зависит от того, как вы его изменяете (все они меняют одни и те же ключи? Разные ключи (например, каждый процесс получает свой собственный ключ) –