在AWS Lambda上运行时未实现_multiprocessing.SemLock

时间:2015-11-30 18:59:20

标签: python-multiprocessing aws-lambda

我有一个使用multiprocessing包的短代码,可以在我的本地计算机上正常运行。

当我上传到AWS Lambda并在那里运行时,我收到以下错误(stacktrace trimmed):

[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核心软件包的一部分没有实现吗?我不知道我在底下跑什么,所以我无法登录并调试。

任何想法如何在Lambda上运行multiprocessing

4 个答案:

答案 0 :(得分:8)

据我所知,多处理无法在AWS Lambda上运行,因为缺少执行环境/容器/dev/shm - 请参阅https://forums.aws.amazon.com/thread.jspa?threadID=219962(可能需要登录)。

如果/当亚马逊改变这一点时,没有任何消息(我能找到)。我还查看了其他库,例如https://pythonhosted.org/joblib/parallel.html如果无法找到/tmpbut that doesn't actually solve the problem,则会回退到/dev/shm(我们知道它已存在)。

答案 1 :(得分:1)

我遇到了同样的问题。这是我以前在本地计算机上运行良好的代码:

import concurrent.futures


class Concurrent:

    @staticmethod
    def execute_concurrently(function, kwargs_list):
        results = []
        with concurrent.futures.ProcessPoolExecutor() as executor:
            for _, result in zip(kwargs_list, executor.map(function, kwargs_list)):
                results.append(result)
        return results

我用这个替换了它:

import concurrent.futures


class Concurrent:

    @staticmethod
    def execute_concurrently(function, kwargs_list):
        results = []
        with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
            futures = [executor.submit(function, kwargs) for kwargs in kwargs_list]
        for future in concurrent.futures.as_completed(futures):
            results.append(future.result())
        return results

像魅力一样工作。

取自this pull request

答案 2 :(得分:1)

您可以升级和使用AWS Lambda运行时Python 3.7。为我工作!

AWS Lambda通过使用运行时来支持多种语言。创建函数时可以选择运行时,并且可以通过更新函数的配置来更改运行时。基础执行环境提供了其他库和环境变量,您可以从功能代码中访问它们。

答案 3 :(得分:0)

multiprocessing.Pool似乎本身不受支持(因为SemLock存在问题),但multiprocessing.Processmultiprocessing.Queuemultiprocessing.Pipe等工作正常AWSLambda。

这应该允许您通过手动创建/分配进程并使用multiprocessing.Pipe进行父进程和子进程之间的通信来构建变通解决方案。希望有所帮助