我有一个使用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
?
答案 0 :(得分:8)
据我所知,多处理无法在AWS Lambda上运行,因为缺少执行环境/容器/dev/shm
- 请参阅https://forums.aws.amazon.com/thread.jspa?threadID=219962(可能需要登录)。
如果/当亚马逊改变这一点时,没有任何消息(我能找到)。我还查看了其他库,例如https://pythonhosted.org/joblib/parallel.html如果无法找到/tmp
,but 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
像魅力一样工作。
答案 2 :(得分:1)
您可以升级和使用AWS Lambda运行时Python 3.7。为我工作!
AWS Lambda通过使用运行时来支持多种语言。创建函数时可以选择运行时,并且可以通过更新函数的配置来更改运行时。基础执行环境提供了其他库和环境变量,您可以从功能代码中访问它们。
答案 3 :(得分:0)
multiprocessing.Pool
似乎本身不受支持(因为SemLock
存在问题),但multiprocessing.Process
,multiprocessing.Queue
,multiprocessing.Pipe
等工作正常AWSLambda。
这应该允许您通过手动创建/分配进程并使用multiprocessing.Pipe
进行父进程和子进程之间的通信来构建变通解决方案。希望有所帮助