Pytanie Pula wieloprocesowa w Pythonie w systemie Windows 8.1 spawns tylko jednego pracownika


Obecnie mam ten fragment kodu (proszę o komentarz!)

def threaded_convert_to_png(self):
    paths = self.get_pages()
    pool = Pool()
    result = pool.map(convert_to_png, paths)
    self.image_path = result

Na platformie Intel i7 pojawia się ośmiu pracowników pracujących pod Linuksem; jednak podczas pracy z Windows 8.1 Pro tylko spawnuje jednego pracownika. Sprawdziłem i cpu_count() zwraca 8 w systemie Linux i Windows.

  • Czy jest tu coś, czego tu brakuje, lub robię coś złego?
  • Czy istnieje sposób na rozwiązanie tego problemu?

P.S. To jest w Pythonie 2.7.6


12
2018-02-21 16:11


pochodzenie


Pool.__init__ połączenia cpu_count aby uzyskać domyślną liczbę procesów (patrz Lib/multiprocessing/pool.py w linii 146). Również __init__ połączenia _repopulate_pool na wiersz 159 która wykonuje pętlę wiersz 213 która spawnuje poprawną liczbę Process instancje. Jesteś pewien, że tylko spawnuje jednego pracownika? W jaki sposób sprawdzasz liczbę pracowników? - Bakuriu
Jestem pewien, ponieważ widzę tylko jeden dodatkowy proces Pythona (a konwersja trwa wieki). Próbowałem nawet przejść Pool(processes=8)i ponownie tylko jeden pracownik został spłodzony. - Drakkainen
Spróbuj stworzyć minimalny pełny przykład kodu, który pokazuje Twój problem np. użycie def f(path): print path, mp.current_process() zamiast convert_to_png() i włącz rejestrowanie mp.log_to_stderr().setLevel(logging.DEBUG). - jfs
co jest len(paths)? - jfs
Czy poprawnie zamknąłeś swój skrypt? if __name__ == '__main__': i jest convert_to_png właściwie zdefiniowane poza nim? (udokumentowane tutaj: docs.python.org/2/library/multiprocessing.html) - Matt


Odpowiedzi:


Jest jeden prosty sposób określenia, co dzieje się w twojej puli - aby włączyć debugowanie wieloprocesowe. Możesz to zrobić tak:

import logging
from multiprocessing import util

util.log_to_stderr(level=logging.DEBUG)

W uruchomionym skrypcie otrzymasz pełne informacje o uruchomionych procesach, odradzaniu i wychodzeniu.

W każdym razie, pula procesów zawsze odradza N procesów (gdzie jest N - "procesami" wartości argumentów lub cpu_count), ale rozkład zadań między procesami może być nierównomierny - zależy to od czasu wykonywania zadania.


1
2018-02-25 10:31





Udało mi się rozwiązać mój podobny problem. Nie jestem pewien, czy to dla ciebie pomoc, ale zdecydowałem się tu to udokumentować, na wypadek gdyby komuś pomógł.

W moim przypadku analizowałem ogromną liczbę tweetów (łącznie 52 000) dzieląc je na wiele procesorów. To działało dobrze na OSX i na serwerze, ale w moim systemie Windows 8.1 było naprawdę wolno i procesy były aktywowane sekwencyjnie. Patrząc na menedżera zadań zauważyłem, że wykorzystanie pamięci Pythona wzrosło do około 1,5 Gb. Zużycie pamięci w procesie roboczym wzrosło podobnie. Teraz zauważyłem, że moja starsza wersja działała dobrze, która miała nieco inny algorytm. W końcu problem polegał na tym, że pobierałem całe tweety z bazy danych, a ja wymagałem tylko części tekstowej tweetów. To najwyraźniej doprowadziło do wzrostu zużycia pamięci. Po naprawieniu tej części program poprawnie uruchomił procesy robocze.

Tak więc na podstawie mojego doświadczenia mam przeczucie, że Windows próbuje kontrolować użycie pamięci RAM, blokując procesy robocze. Jeśli tak, sprawdź wykorzystanie pamięci RAM w swoich procesach. To tylko spekulacja z mojej strony, więc jestem zainteresowany, czy ktoś ma lepsze wyjaśnienie.


1
2018-02-27 21:42