OSError 38 [Errno 38] 与多进程相关

16 投票
2 回答
23035 浏览
提问于 2025-04-16 17:49

我遇到了以下错误:

$ sudo chmod a+rwxt /dev/shm/
$ ls -ld /dev/shm/
drwxrwxrwt 2 root root 4096 Feb  4 06:56 /dev/shm/
$ python
Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import multiprocessing
>>> mp = multiprocessing.Pool(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/multiprocessing/__init__.py", line 227, in Pool
    return Pool(processes, initializer, initargs)
  File "/usr/lib/python2.6/multiprocessing/pool.py", line 84, in __init__
    self._setup_queues()
  File "/usr/lib/python2.6/multiprocessing/pool.py", line 131, in _setup_queues
    self._inqueue = SimpleQueue()
  File "/usr/lib/python2.6/multiprocessing/queues.py", line 328, in __init__
    self._rlock = Lock()
  File "/usr/lib/python2.6/multiprocessing/synchronize.py", line 117, in __init__
    SemLock.__init__(self, SEMAPHORE, 1, 1)
  File "/usr/lib/python2.6/multiprocessing/synchronize.py", line 49, in __init__
    sl = self._semlock = _multiprocessing.SemLock(kind, value, maxvalue)
OSError: [Errno 38] Function not implemented

除了对 /dev/shm 的读写权限问题,还有什么其他原因可能导致这个错误呢?

谢谢!

2 个回答

7

我觉得这可能和这个有关:http://bugs.python.org/issue3770

根据Python的文档:

警告: 这个包的一些功能需要主机操作系统上有一个正常工作的共享信号量实现。如果没有这个,multiprocessing.synchronize模块就会被禁用,尝试导入它会导致ImportError错误。更多信息请查看问题3770。

这可能相关,也可能不相关,因为它提到了multiprocessing.synchronize,但根据我的理解,有些平台的某些实现根本没有实现Python在这里依赖的信号量API,这可能就是你遇到的问题。

20

对于从谷歌过来的朋友,答案在这里:Django Celery 实现 - OSError errno 38 - 功能未实现

我通过在 /etc/fstab 文件中添加 none /dev/shm tmpfs rw,nosuid,nodev,noexec 0 0 来解决这个问题,然后重启了电脑。

其实不重启也可以,直接用 sudo mount /dev/shm 命令就能解决。

撰写回答