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
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.
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.