Wenn ich im Python-Interpreter einen Pool mit einer unannehmbar hohen Anzahl von Prozessen erstelle, tritt offensichtlich ein Fehler auf. Es scheint jedoch nicht, dass die gegabelten Prozesse zuvor bereinigt werden, wodurch die Umgebung verschmutzt bleibt. und der Rest des Systems kann keine Prozesse verzweigen.

>>> from multiprocessing import Pool
>>> p = Pool(1000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/__init__.py", line 232, in Pool
    return Pool(processes, initializer, initargs, maxtasksperchild)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 159, in __init__
    self._repopulate_pool()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 222, in _repopulate_pool
    w.start()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 130, in start
    self._popen = Popen(self)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/forking.py", line 121, in __init__
    self.pid = os.fork()
OSError: [Errno 35] Resource temporarily unavailable

>>> p = Pool(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/__init__.py", line 232, in Pool
    return Pool(processes, initializer, initargs, maxtasksperchild)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 159, in __init__
    self._repopulate_pool()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 222, in _repopulate_pool
    w.start()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 130, in start
    self._popen = Popen(self)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/forking.py", line 121, in __init__
    self.pid = os.fork()
OSError: [Errno 35] Resource temporarily unavailable

Gibt es eine Möglichkeit, dies zu vermeiden / zu beheben, oder wird dies als Fehler angesehen?

5
Dustin Oprea 19 Nov. 2013 im 19:49

3 Antworten

Beste Antwort

Gibt es eine Möglichkeit, dies zu vermeiden / zu beheben?

Tu das nicht.

oder wird es als Fehler angesehen?

Ja in dem Sinne, dass alle zugewiesenen Ressourcen freigegeben werden sollten, wenn der Initialisierer fehlschlägt. Sie sollten überprüfen, welchen spezifischen Build von 2.7 Sie verwenden, und feststellen, ob in späteren Builds mehrere prozessspezifische Bibliotheksfehler behoben wurden (Versionshinweise zu 2.7.6: http://hg.python.org/cpython/raw-file/99d03261c1ba/Misc/NEWS).

Ich gehe davon aus, dass Ihre Plattform OSX ist, basierend auf den Pfaden im Stacktrace. Hier ist ein Beitrag zu Errno 35 (der in OSX EAGAIN zu sein scheint) beim Gabeln - Ich kann nicht mehr als 100 Prozesse ausführen

Was auch immer Sie erreichen möchten, es scheint, dass Sie eine Beschränkung der Ressourcennutzung auf Anwendungsebene einbeziehen müssen. Das bedeutet, dass Sie möglicherweise Ihre Lösung überdenken müssen. Mit Ihrer derzeitigen Lösung und dem behobenen Fehler wird das Ressourcenlimit wahrscheinlich auch in anderen Kontexten systemweit angezeigt.

2
Community 23 Mai 2017 im 12:10

Ich hatte das gleiche Problem und es konnte es gemäß Dustins Kommentar beheben.

Ticket: http://bugs.python.org/issue19675

Ich verwende Python 2.7.8 unter Mac OS Mavericks

2
Mit Mehta 21 Nov. 2014 im 15:22

In meinem Fall sollten Sie das "ulimit -n 2048" in dem Terminal einstellen, in dem Sie die Funktion ausführen möchten. die Zahl 2048 könnte höher sein. Es hat mein Problem gelöst.

0
霜之哀伤 10 Mai 2019 im 08:03