it-swarm.com.de

Multiprocessing führt zum Absturz von Python und gibt möglicherweise einen Fehler aus, der in einem anderen Thread ausgeführt wurde, als fork () aufgerufen wurde

Ich bin relativ neu in Python und versuche, ein Multiprocessing-Modul für meine for-Schleife zu implementieren.

Ich habe eine Reihe von Bild-URLs in img_urls gespeichert, die ich herunterladen und Google Vision anwenden muss.

if __name__ == '__main__':

    img_urls = [ALL_MY_Image_URLS]
    runAll(img_urls)
    print("--- %s seconds ---" % (time.time() - start_time)) 

Dies ist meine runAll () -Methode

def runAll(img_urls):
    num_cores = multiprocessing.cpu_count()

    print("Image URLS  {}",len(img_urls))
    if len(img_urls) > 2:
        numberOfImages = 0
    else:
        numberOfImages = 1

    start_timeProcess = time.time()

    pool = multiprocessing.Pool()
    pool.map(annotate,img_urls)
    end_timeProcess = time.time()
    print('\n Time to complete ', end_timeProcess-start_timeProcess)

    print(full_matching_pages)


def annotate(img_path):
    file =  requests.get(img_path).content
    print("file is",file)
    """Returns web annotations given the path to an image."""
    print('Process Working under ',os.getpid())
    image = types.Image(content=file)
    web_detection = vision_client.web_detection(image=image).web_detection
    report(web_detection)

Ich erhalte dies als Warnung, wenn ich es ausführe und python abstürzt

objc[67570]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called.
objc[67570]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
objc[67567]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called.
objc[67567]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
objc[67568]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called.
objc[67568]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
objc[67569]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called.
objc[67569]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
objc[67571]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called.
objc[67571]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
objc[67572]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called.
objc[67572]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
34

Dieser Fehler tritt aufgrund der zusätzlichen Sicherheit auf, um Multithreading in Mac OS High Sierra einzuschränken. Ich weiß, dass diese Antwort etwas spät ist, aber ich habe das Problem mit der folgenden Methode gelöst:

Legen Sie eine Umgebungsvariable .bash_profile fest, um Multithreading-Anwendungen oder -Skripts gemäß den neuen Sicherheitsregeln für Mac OS High Sierra zuzulassen.

Öffnen Sie ein Terminal:

$ nano .bash_profile

Fügen Sie die folgende Zeile am Ende der Datei hinzu:

export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES

Speichern, beenden, Terminal schließen und Terminal erneut öffnen. Überprüfen Sie, ob die Umgebungsvariable jetzt festgelegt ist:

$ env

Sie sehen eine Ausgabe ähnlich der folgenden:

TERM_PROGRAM=Apple_Terminal
Shell=/bin/bash
TERM=xterm-256color
TMPDIR=/var/folders/pn/vasdlj3ojO#OOas4dasdffJq/T/
Apple_PubSub_Socket_Render=/private/tmp/com.Apple.launchd.E7qLFJDSo/Render
TERM_PROGRAM_VERSION=404
TERM_SESSION_ID=NONE
OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES

Sie sollten jetzt in der Lage sein, Ihr python Skript mit Multithreading auszuführen.

79
jonnyjandles