2016-12-21 4 views
1

Ich habe derzeit Probleme mit dem Umgang mit diesem Problem in Python 3.5 +.Multiprocessing, Multithreading oder asyncio für diese

Ich habe Code, der wie folgt aussieht:

while True: 
    do_process1() # run this synchronously 
    do_process2() # don't wait on this to go to the next iteration but need to handle its completion 

Und in diesem Fall nimmt do_process2() eine lange Zeit. Ich möchte do_process2() asynchron ausführen, damit die nächste Iteration der Schleife nicht auf do_process2() wartet, um abzuschließen.

Von dem, was ich lese, könnte ich Multithreading verwenden, aber mit der GIL sehe ich nicht, wie ich do_process2() "offload" und die Ausführung der nächsten Iteration fortsetzen kann.

Es scheint, als würde Multiprozessing hier gut passen. Viele der Beispiele, die ich da draußen sehe, sind auf warten auf den Subprozess, um die Arbeit zu beenden. Ich möchte das nicht tun, ich möchte weiterhin die while Schleife ausführen.

Ebenso möchte ich in der Lage sein, einen Rückruf von einem asynchronen Aufruf an do_process2() zu behandeln, damit ich den Abschluss dieser Operation behandeln kann. Ich sehe, dass ich das mit einemObjekt zu apply_async() tun könnte, aber ist das der beste Ansatz hier?

Was ist der beste Ansatz hier? Und ich benutze Python 3.5+ und frage mich, wo asyncio in all das passt? Ich denke wie multi threading, würde ich nicht den Gewinn haben, den ich auf dem Ausladen und fortsetzender Arbeit suche.

Antwort

0

Es hängt davon ab, was genau drin ist do_process2 geschieht, ist multiprocessing die sichere Wahl immer (Art eine eine Größe gepasst ist alles), da CPython einige dokumentierte Probleme mit Threads und der GIL hat, gibt es einige ereignisgesteuerte Lösungen, aber einige von ihnen haben Portabilität Probleme (ich viele Python-Code in Windows laufen, damit die Portabilität ein Deal breaker für mich ist), schließlich gibt es asyncio, welche Art von cool, aber wie die Ankündigung

das asyncio Paket sagt hat in dem aufgenommen Standardbibliothek vorläufig. Rückwärtskompatible Änderungen (bis hin zur Entfernung des Moduls) können auftreten, wenn dies von den Kernentwicklern als notwendig erachtet wird.

+0

Danke für die Information! Sorgt "Asyncio" für den Multithreading-Teil von Python? Ist es nur ein anderer Weg? – user7327326

Verwandte Themen