Die einfache Mehrfachverarbeitungsfunktion funktioniert nicht, aber warum

Niels

Ich versuche, Systembefehle zu verarbeiten, kann sie jedoch nicht mit einem einfachen Programm zum Laufen bringen. Die Funktion runit (cmd) funktioniert aber einwandfrei ...

#!/usr/bin/python3
from subprocess import call, run, PIPE,Popen
from multiprocessing import Pool
import os
pool = Pool()

def runit(cmd):
    proc = Popen(cmd, shell=True,stdout=PIPE, stderr=PIPE, universal_newlines=True)
    return proc.stdout.read()

#print(runit('ls -l'))

it = []
for i in range(1,3):
    it.append('ls -l')

results = pool.map(runit, it)

Es gibt aus:

Process ForkPoolWorker-1:
Process ForkPoolWorker-2:
Traceback (most recent call last):
Traceback (most recent call last):
  File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap
    self.run()
  File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python3.5/multiprocessing/pool.py", line 108, in worker
    task = get()
  File "/usr/lib/python3.5/multiprocessing/queues.py", line 345, in get
    return ForkingPickler.loads(res)
AttributeError: Can't get attribute 'runit' on <module '__main__' from './syscall.py'>
  File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap
    self.run()
  File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python3.5/multiprocessing/pool.py", line 108, in worker
    task = get()
  File "/usr/lib/python3.5/multiprocessing/queues.py", line 345, in get
    return ForkingPickler.loads(res)
AttributeError: Can't get attribute 'runit' on <module '__main__' from './syscall.py'>

Dann wartet es irgendwie und tut nichts, und wenn ich ein paar Mal Strg + C drücke, spuckt es aus:

^CProcess ForkPoolWorker-4:
Process ForkPoolWorker-6:
Traceback (most recent call last):
  File "./syscall.py", line 17, in <module>
Process ForkPoolWorker-5:
    results = pool.map(runit, it)
  File "/usr/lib/python3.5/multiprocessing/pool.py", line 260, in map
...
    buf = self._recv(4)
  File "/usr/lib/python3.5/multiprocessing/connection.py", line 379, in _recv
    chunk = read(handle, remaining)
KeyboardInterrupt
Jean-Francois Fabre

Ich bin mir nicht sicher, da das Problem, das ich kenne, mit Windows zusammenhängt (und ich keinen Zugriff auf die Linux-Box habe, um es erneut zu verarbeiten), aber um portabel zu sein, müssen Sie Ihre multiprocessing-abhängigen Befehle einbinden, da if __name__=="__main__"dies zu Konflikten führt Die Art und Weise, wie Python die Prozesse erzeugt: Dieses feste Beispiel läuft unter Windows einwandfrei (und sollte auch auf anderen Plattformen einwandfrei funktionieren):

from multiprocessing import Pool
import os

def runit(cmd):
    proc = Popen(cmd, shell=True,stdout=PIPE, stderr=PIPE, universal_newlines=True)
    return proc.stdout.read()

#print(runit('ls -l'))

it = []
for i in range(1,3):
    it.append('ls -l')

if __name__=="__main__":
    # all calls to multiprocessing module are "protected" by this directive
    pool = Pool()

(Wenn ich die Fehlermeldungen genauer studiere, bin ich mir jetzt ziemlich sicher, dass ein Umzug pool = Pool() nach der Deklaration von runitdas Problem auch unter Linux beheben würde, aber das Einschließen von __main__Fixes + macht es portabel.)

Beachten Sie jedoch, dass Ihre Mehrfachverarbeitung nur einen neuen Prozess erstellt, sodass Sie mit Thread-Pools ( Threading-Pool ähnlich dem Multiprocessing-Pool? ) Besser dran sind : Threads, die Prozesse wie folgt erstellen :

from multiprocessing.pool import ThreadPool  # uses threads, not processes
import os

def runit(cmd):
    proc = Popen(cmd, shell=True,stdout=PIPE, stderr=PIPE, universal_newlines=True)
    return proc.stdout.read()

it = []
for i in range(1,3):
    it.append('ls -l')

if __name__=="__main__":
    pool = ThreadPool()   # ThreadPool instead of Pool
    results = pool.map(runit, it)
    print(results)
        results = pool.map(runit, it)
        print(results)

Die letztere Lösung ist leichter und weniger problemanfällig (Multiprocessing ist ein heikles Modul). Sie können unter anderem mit Objekten, gemeinsam genutzten Daten usw. arbeiten, ohne dass ein ManagerObjekt erforderlich ist

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Warum funktioniert "NOT IN" nicht, aber die Unterabfrage "NOT IN" funktioniert?

Diese einfache Linksverknüpfungsoperation funktioniert nicht, aber warum?

Warum funktioniert die Karte nicht, aber foreach?

Einfache REST-App, die lokal, aber nicht in Heroku funktioniert

Zwei einfache IBM MQ-Client-Tests schreiben in die MQ-Warteschlange - warum funktioniert einer, aber NICHT der andere?

ReactiveUI - warum funktioniert die einfache ReactiveList.Changed -> ToProperty nicht?

Warum funktioniert in diesem Fall die einfache Verknüpfung nicht?

Warum funktioniert die einfache Regex über das "*"-Muster nicht?

Warum funktioniert die einfache arithmetische Subtraktion nicht in der "Wenn"-Bedingung?

Warum funktioniert eine einfache for-Schleife Arbeit im onCreate Methode, aber nicht in der MainActivity Klasse?

Warum versteht die Funktionsvorlage NULL nicht, funktioniert aber mit nullptr?

Warum funktioniert die automatische Perlivifizierung nicht für -> @ *, aber -> @ [0]?

Warum funktioniert die << - Zuweisung in meiner Funktion, aber <- nicht?

Warum funktioniert die Zuweisung "=>" in diesem Fall, aber nicht "="?

Javascript: Warum funktioniert die Variable lokal, aber nicht global?

Warum funktioniert dieser einfache bedingte Ausdruck nicht?

Warum funktioniert diese einfache Vererbung nicht?

Warum diese einfache gespeicherte Prozedur nicht funktioniert

Warum funktioniert diese einfache Funktion nicht?

Warum funktioniert dieser einfache Aufruf in JavaScript nicht?

Warum funktioniert dieses einfache Java for Loop nicht?

Warum funktioniert diese einfache Logik nicht?

Warum funktioniert diese einfache Deckkraftanimation in SwiftUI nicht?

Warum funktioniert diese einfache Komposition nicht?

Django: Warum funktioniert dieses einfache Tag nicht?

Warum funktioniert diese einfache Zuweisungsanweisung nicht (vba)?

Warum funktioniert dieses einfache Beispiel nicht mehr?

Warum wird die folgende Pfeilfunktion nicht ausgeführt, aber eine einfache if-Anweisung?

Warum funktioniert die Methode in Python nicht, aber der Code über die Methode hinaus funktioniert?

TOP Liste

  1. 1

    Modbus Python Schneider PM5300

  2. 2

    Wie schließe ich mehrere Ordner mit der Variablen EXTRA_ARGS aus?

  3. 3

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

  4. 4

    Elasticsearch startet nicht nach dem Laden in viele Daten

  5. 5

    ElasticSearch - Knotensperren konnten nicht abgerufen werden

  6. 6

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  7. 7

    Eclipse Oxygen - Projekte verschwinden

  8. 8

    Wie kann ich den Kaskadenmodus global einstellen?

  9. 9

    ElasticSeach Auto Complete mit dem Vervollständigungsvorschlag, um das vollständige Dokument zurückzugeben

  10. 10

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  11. 11

    Bester Crawler, um festzustellen, ob er mit Technologien gebaut wurde?

  12. 12

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  13. 13

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  14. 14

    Wie füge ich eine Spalte in einer Zeile in der Ansible Jinja2-Vorlage mit der for-Schleife hinzu?

  15. 15

    Wie Verwenden von Httpclient mit jedem SSL-Zertifikat, egal wie „schlecht“ es ist

  16. 16

    Wie kann man eine Multi-Container-Anwendung in Steuerkarten erstellen?

  17. 17

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  18. 18

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  19. 19

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  20. 20

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  21. 21

    So erstellen Sie ein langes Etikett inline mit einem Eingabefeld

heißlabel

Archiv