2013-09-26 12 views
12

Próbuję użyć pakietu multiprocessing dla Python. Przeglądając samouczki, najwyraźniejszą i najprostszą techniką wydaje się być użycie pool.map, która pozwala użytkownikowi łatwo nazwać liczbę procesów i przekazać pool.map funkcję i listę wartości dla tej funkcji do dystrybucji w procesorach. Inną techniką, którą spotkałem jest using queues do zarządzania pulą pracowników. To answer wykonuje doskonałą pracę wyjaśniając różnicę między pool.map, pool.apply i pool.apply_async, ale jakie są zalety i wady korzystania z pool.map w porównaniu do korzystania z kolejek, takich jak w tym example?Python Multiprocessing: pool.map vs używanie kolejek

Odpowiedz

9

Technika pool.map jest "podzbiorem" techniki z kolejkami. Oznacza to, że bez konieczności posiadania pool.map można go łatwo zaimplementować za pomocą Pool i Queue. To powiedziawszy, używanie kolejek daje ci dużo większą elastyczność w kontrolowaniu procesów puli, tzn. Możesz sprawić, że poszczególne typy komunikatów będą odczytywane tylko jeden raz przez cały cykl życia procesów, kontrolować procesy zamykania procesów w pulach itd.

+0

Czy 'pool.map' automatycznie zamyka procesy po zakończeniu? – Michael

+1

Z dokumentów: '' Gdy obiekt puli jest zbiorem śmieci, terminate() zostanie natychmiast wywołane. ". Ale nie będę polegać na tym - lepiej, jeśli upewnisz się, że basen jest zamknięty na końcu twojej aplikacji. W przeciwnym razie możesz skończyć z kilkoma zombie pozostawionymi w twoim systemie. Jeśli chodzi o 'pool.map' - nie, to nie wyłącza procesów. Procesy trwają tak długo, jak ich pula, chyba że są zamknięte lub osierocone. –

4

Jeśli naprawdę szukasz "najczystszej i najprostszej techniki", najprawdopodobniej najprościej jest użyć concurrent.futures.ProcessPoolExecutor. Ma on metodę map, a także kilka innych prymitywów, które czynią ją bardzo użyteczną. Jest również kompatybilny z Queue s.

+0

bardzo łatwa i intuicyjna biblioteka. – Jaydev

Powiązane problemy