2012-04-29 2 views
6

Piszę program próbki do testowania użycie wieloprocesorowe pulę pracowników w Pythonie 2.7.2+pyton basen wieloprocesorowe Twierdzenie Błąd tłumacza

Jest to kod Pisałem w interpretera Pythona ubuntu

>>> from multiprocessing import Pool 
>>> def name_append(first_name,last_name): 
...  return first_name+" "+last_name 
... 

>>> from functools import partial 
>>> partial_name_append=partial(name_append,'kiran') 
>>> partial_name_append('acb') 
'kiran acb' 
>>> abc='kiran' 

>>> pool=Pool(processes=4) 
>>> pool.map(partial_name_append,abc) 
['kiran k', 'kiran i', 'kiran r', 'kiran a', 'kiran n'] 
>>> pool.close() 
>>> pool.join() 

>>> pool.map(partial_name_append,abc) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/multiprocessing/pool.py", line 226, in map 
    assert self._state == RUN 
AssertionError 

Po tym, jak dostałem błędy pikle, nad moją pulą kodu pracowników dla dużych zestawów danych, próbuję zrobić małe przykłady i spróbować dowiedzieć się, co jest błędem.

Nie rozumiem, dlaczego to samo wyrażenie "pool.map" nie działa, gdy działało powyżej. Myślę, że poprawnie wykonałem "mapę puli", ale nie rozumiem powodu.

Jest to błąd związany z "PicklingError: Nie można marynowane: wyszukiwanie atrybutu wbudowane .function failed"

Czy ktoś może mi pomóc?

Dzięki

+1

Funkcja "multiprocessing.Pool()' nie działa w Interpreter interakcyjny. Sprawdź dokumentację [tutaj] (http://docs.python.org/library/multiprocessing.html) –

+0

'multiprocess.Pool()' działa jednak w Interaktywnym tłumaczu. –

Odpowiedz

15

Wpisano:

>>> pool.close() 

from the docs:

close()

Prevents any more tasks from being submitted to the pool. Once all the tasks have been completed the worker processes will exit.

Oczywiście nie można już korzystać z basenu, możesz je zamknięte.

+0

, więc jeśli ponownie użyję 'pool = Pool (processes = 4)', to czy mogę go użyć ponownie? Edycja: zadziałało, gdy ponownie przypisałem pulę. Dziękuję .. Jeśli nie masz nic przeciwko, mam inne pytanie "Wybijanie błędów: Nie mogę się doczekać: atrybut wyszukiwania nie powiodło się wbudowanie.funkcji" Nie jestem w stanie zrozumieć dlaczego Ciągle otrzymuję ten błąd, gdy używam pool.map() w programie – kich

+1

, nie zamykaj w ogóle puli (dopóki nie będziesz już jej potrzebować). nie trzeba 'join()' puli (i dlatego też nie trzeba jej zamykać), aby czekać na wyniki z 'Pool.map()', blokuje się, dopóki wyniki nie będą gotowe. możesz nadal używać 'map()', które lubisz. – SingleNegationElimination