Ich habe ein agentenbasiertes Modell, bei dem mehrere Agenten durch einen zentralen Prozess gestartet werden und über einen anderen zentralen Prozess kommunizieren. Jeder Agent und der Kommunikationsprozess kommunizieren über zmq. Wenn ich jedoch mehr als 100 Agenten starte, sendet standard_out:
Ungültiges Argument (src / stream_engine.cpp: 143) Zu viele offene Dateien (src / ipc_listener.cpp: 292)
und Mac Os meldet einen Problembericht:
Python wurde unerwartet beendet, als das libzmq.5.dylib-Plug-in verwendet wurde.
Das Problem scheint mir, dass zu viele Kontexte geöffnet sind. Aber wie kann ich das mit Multiprocessing vermeiden?
Ich füge einen Teil des folgenden Codes an:
%Vor%Der gesamte Code ist unter Ссылка
Wahrscheinlich sind das nicht zu viele Kontexte, es sind zu viele Sockets. Beim Durchsehen Ihres Repos sehe ich, dass Sie IPC (korrekt) als Transportmittel verwenden. IPC verwendet einen Dateideskriptor als "Adresse", um Daten zwischen verschiedenen Prozessen hin und her zu leiten. Wenn ich richtig lese, öffnest du bis zu 7 Sockets pro Prozess, also summiert sich das schnell. Ich wette, wenn Sie ein Debugging in der Mitte Ihres Codes durchführen, werden Sie sehen, dass es nicht beim Erstellen des letzten Kontexts fehlschlägt, sondern wenn das letzte Socket das Limit für offene Dateien über die Kante hinausschiebt. p>
Nach meinem Verständnis liegt das typische Benutzerlimit für offene FDs bei ungefähr 1000, also drücken Sie bei ungefähr 100 Agenten 700 offene FDs nur für Ihre Sockets. Der Rest ist wahrscheinlich nur typisch. Es sollte kein Problem sein, Ihr Limit bis zu 10.000 zu erhöhen, abhängig von Ihrer Situation. Andernfalls müssen Sie neu schreiben, um weniger Sockets pro Prozess zu verwenden, um eine höhere Prozessgrenze zu erhalten.
Das hat nichts mit zeromq oder python zu tun. Es ist das zugrundeliegende Betriebssystem, das nur bis zu einem bestimmten Schwellenwert von gleichzeitig geöffneten Dateien erlaubt. Dieses Limit beinhaltet normale Dateien, aber auch Socket-Verbindungen.
Sie können Ihr aktuelles Limit mit ulimit -n
sehen, es wird wahrscheinlich auf 1024
gesetzt. Computer, auf denen Server ausgeführt werden oder die aus anderen Gründen (z. B. Multiprozessing) bestehen, müssen dieses Limit oft höher oder nur auf unlimited
setzen. - Weitere Informationen über ulimit
.
Außerdem gibt es noch ein globales Limit , allerdings muss ich noch nichts anpassen.
Im Allgemeinen sollten Sie sich fragen, ob Sie wirklich so viele Agenten brauchen. Normalerweise sollten X
/ 2X
Worker-Prozesse ausreichen, wobei X
Ihrer CPU-Anzahl entspricht.
Tags und Links zeromq python-multiprocessing