2015-11-30 37 views
10

multiprocessingパッケージを使用し、ローカルマシンで正常に動作する短いコードがあります。AWS Lambdaで実行しているときに_multiprocessing.SemLockが実装されていません

私はAWS Lambdaにアップロードされ、そこに実行すると、私は次のエラーを得た(スタックトレースをトリミング):

[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 

それが実装されていませんでPythonのコアパッケージの一部ということはできますか?私は何の下に実行されているので、私はそこにログインしてデバッグすることができないのか分からない。

ラムダでmultiprocessingを実行するにはどうすればよいですか?

答えて

7

実行環境/コンテナがないため、マルチ処理はAWS Lambdaで動作しません/dev/shm - https://forums.aws.amazon.com/thread.jspa?threadID=219962(ログインが必要な場合があります)を参照してください。

アマゾンがこれを変更するかどうかについては言及していないので、私は他のライブラリを見ています。 https://pythonhosted.org/joblib/parallel.htmlは、が見つからない場合、/tmp(これはわかっています)にフォールバックします。

+1

あなたはjoblibでこの問題を解決する方法を詳しく説明できますか?私は今すぐテストしていますが、ジョブライブラリはシリアル操作に失敗しています: '[Errno 38] Function not implemented。 joblibはシリアルモードで動作します。 – pjgranahan

+0

[このスレッド](https://github.com/joblib/joblib/issues/391)は、joblibが実際にこの問題を回避できないことを示唆しているようです。 – pjgranahan

+0

申し訳ありませんが、私はこれを十分に深く掘ったことはありません。うまくいきません。 – glennji

1

multiprocessing.PoolはAWSLambdaで正しく動作など(なぜならSemLockの問題の)ネイティブにサポートしているように見えるが、multiprocessing.Processmultiprocessing.Queuemultiprocessing.Pipeしません。

これにより、手動でプロセスを作成/分岐し、親プロセスと子プロセス間の通信にmultiprocessing.Pipeを使用することで、回避策のソリューションを構築できます。希望が助けます

+1

'' 'multiprocessing.Queue'''は私にとってはうまくいかず、質問と同じエラーが出ます。 –

+0

キューは機能せず、/ dev/shmなしのプロセス間でロックを行うことはできません – Atifm

関連する問題