rozważyć plik sample.py
zawiera następujący kod:imap_unordered() zawiesza się, jeśli iterable zgłasza błąd
from multiprocessing import Pool
def sample_worker(x):
print "sample_worker processes item", x
return x
def get_sample_sequence():
for i in xrange(2,30):
if i % 10 == 0:
raise Exception('That sequence is corrupted!')
yield i
if __name__ == "__main__":
pool = Pool(24)
try:
for x in pool.imap_unordered(sample_worker, get_sample_sequence()):
print "sample_worker returned value", x
except:
print "Outer exception caught!"
pool.close()
pool.join()
print "done"
Kiedy go wykonać, pojawia się następujący komunikat:
Exception in thread Thread-2:
Traceback (most recent call last):
File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
self.run()
File "C:\Python27\lib\threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "C:\Python27\lib\multiprocessing\pool.py", line 338, in _handle_tasks
for i, task in enumerate(taskseq):
File "C:\Python27\lib\multiprocessing\pool.py", line 278, in <genexpr>
self._taskqueue.put((((result._job, i, func, (x,), {})
File "C:\Users\renat-nasyrov\Desktop\sample.py", line 10, in get_sample_sequence
raise Exception('That sequence is corrupted!')
Exception: That sequence is corrupted!
Po tym, aplikacja się zawiesza. Jak mogę sobie poradzić z sytuacją bez zawieszania się?
Twoje wcięcie jest nieprawidłowe ... – tamasgal
@septi: naprawiono, dziękuję. – Pehat
Przeszedłem kod za pomocą debuggera i działało zgodnie z oczekiwaniami. Jednak gdy ją wykonuję, otrzymuję zachowanie, które opisujesz. Więc może istnieje kwestia współbieżności w imap_unordered? – phobic