2015-11-30 7 views
10

Ich habe einen kurzen Code, der das multiprocessing-Paket verwendet und auf meinem lokalen Computer funktioniert. _multiprocessing.SemLock ist nicht implementiert, wenn auf AWS Lambda

Als ich AWS Lambda hochgeladen und dort laufen, bekam ich die folgende Fehlermeldung (stacktrace getrimmt):

[Errno 38] Function not implemented: OSError 
Traceback (most recent call last): 
    File "/var/task/recorder.py", line 41, in record 
    pool = multiprocessing.Pool(10) 
    File "/usr/lib64/python2.7/multiprocessing/__init__.py", line 232, in Pool 
    return Pool(processes, initializer, initargs, maxtasksperchild) 
    File "/usr/lib64/python2.7/multiprocessing/pool.py", line 138, in __init__ 
    self._setup_queues() 
    File "/usr/lib64/python2.7/multiprocessing/pool.py", line 234, in _setup_queues 
    self._inqueue = SimpleQueue() 
    File "/usr/lib64/python2.7/multiprocessing/queues.py", line 354, in __init__ 
    self._rlock = Lock() 
    File "/usr/lib64/python2.7/multiprocessing/synchronize.py", line 147, in __init__ 
    SemLock.__init__(self, SEMAPHORE, 1, 1) 
    File "/usr/lib64/python2.7/multiprocessing/synchronize.py", line 75, in __init__ 
    sl = self._semlock = _multiprocessing.SemLock(kind, value, maxvalue) 
OSError: [Errno 38] Function not implemented 

Kann es sein, dass ein Teil der Kernpakete der Python in nicht umgesetzt? Ich habe keine Ahnung, worauf ich unten laufe, also kann ich mich dort nicht einloggen und debuggen.

Irgendwelche Ideen wie kann ich multiprocessing auf Lambda laufen?

Antwort

7

Soweit ich das beurteilen kann, wird Multiprozessing bei AWS Lambda nicht funktionieren, da die Ausführungsumgebung/Container fehlt /dev/shm - siehe https://forums.aws.amazon.com/thread.jspa?threadID=219962 (Anmeldung möglicherweise erforderlich).

Kein Wort (das ich finden kann) auf, wenn/wenn Amazon das ändern wird, so schaue ich auf andere Bibliotheken, z. https://pythonhosted.org/joblib/parallel.html Fallback zu /tmp (die wir wissen, existiert), wenn es /dev/shm nicht finden kann.

+1

Können Sie näher erläutern, wie dieses Problem mit joblib zu lösen? Ich teste es gerade aus, und Joblib geht zurück zu seriellen Operationen: '[Errno 38] Funktion nicht implementiert. Joblib wird im seriellen Modus arbeiten. – pjgranahan

+0

[Dieser Thread] (https://github.com/joblib/joblib/issues/391) scheint darauf hinzuweisen, dass joblib dieses Problem nicht umgehen kann. – pjgranahan

+0

Ja, Entschuldigung, ich habe nie tief genug gegraben. Könnte gut nicht funktionieren. – glennji

1

multiprocessing.Pool scheint nicht nativ unterstützt werden (wegen der Ausgabe mit SemLock), aber multiprocessing.Process, multiprocessing.Queue, multiprocessing.Pipe etc Arbeit richtig in AWSLambda.

Das sollte Ihnen ermöglichen, eine Problemumgehungslösung zu erstellen, indem Sie Prozesse manuell erstellen/forkten und multiprocessing.Pipe für die Kommunikation zwischen den übergeordneten und unterordneten Prozessen verwenden. Hoffe, dass hilft

+1

'' 'Multiprocessing.Queue''' funktioniert nicht für mich und ich bekomme den gleichen Fehler wie in der Frage. –

+0

Die Warteschlange funktioniert nicht, und Sie können keine Sperren zwischen den Prozessen ohne/dev/shm ausführen – Atifm