from multiprocessing import Pool
import contextlib
def initializer():
raise Exception("init failed")
def do_something(args):
# main process
pass
pool = Pool(1, initializer=initializer)
with contextlib.closing(pool):
try:
pool.map_async(do_something, [1]).get(100)
except:
pool.terminate()
< /code>
Die nie anhaltende Stacktrace auf der Konsole ist unter < /p>
...
Exception: init failed
Process ForkPoolWorker-18:
Traceback (most recent call last):
File "/home/hoge/anaconda3/lib/python3.6/multiprocessing/process.py", line 249, in _bootstrap
self.run()
File "/home/hoge/anaconda3/lib/python3.6/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "/home/hoge/anaconda3/lib/python3.6/multiprocessing/pool.py", line 103, in worker
initializer(*initargs)
File "hoge.py", line 5, in initializer
raise Exception("init failed")
Exception: init failed
...
< /code>
Mein Problemumgehung unterdrückt den Initialisiererfehler und kehrt am Anfang des Hauptprozesses zurück, indem ich globales Flag wie unten verwendet.def initializer():
try:
raise Exception("init failed")
except:
global failed
failed = True
def do_something(args):
global failed
if failed:
# skip when initializer failed
return
# main process
Wenn der Initializer -Fehler wie unten sterben, wird das Skript nicht gestoppt.[code]from multiprocessing import Pool import contextlib
def initializer(): raise Exception("init failed")
def do_something(args): # main process pass
pool = Pool(1, initializer=initializer) with contextlib.closing(pool): try: pool.map_async(do_something, [1]).get(100) except: pool.terminate() < /code>
Die nie anhaltende Stacktrace auf der Konsole ist unter < /p>
... Exception: init failed Process ForkPoolWorker-18: Traceback (most recent call last): File "/home/hoge/anaconda3/lib/python3.6/multiprocessing/process.py", line 249, in _bootstrap self.run() File "/home/hoge/anaconda3/lib/python3.6/multiprocessing/process.py", line 93, in run self._target(*self._args, **self._kwargs) File "/home/hoge/anaconda3/lib/python3.6/multiprocessing/pool.py", line 103, in worker initializer(*initargs) File "hoge.py", line 5, in initializer raise Exception("init failed") Exception: init failed ... < /code>
Mein Problemumgehung unterdrückt den Initialisiererfehler und kehrt am Anfang des Hauptprozesses zurück, indem ich globales Flag wie unten verwendet.def initializer(): try: raise Exception("init failed") except: global failed failed = True
def do_something(args): global failed if failed: # skip when initializer failed return # main process [/code]
Ich habe ein großes Skript, in dem ich Terabytes an Wetter-/Klimadaten verarbeite, die im Rasterformat vorliegen. Ich habe ein Skript, das eine äußere Schleife (über die Jahre – 1979 bis 2024)...