Я пытаюсь использовать многопроцессорный пакет и внедрить пул, но получаю сообщение об ошибке:
ImportError: На этой платформе отсутствует работающая реализация sem_open, поэтому необходимые примитивы синхронизации не будут работатьсм. выпуск 3770.
Однако, если я напишу другую отдельную тестовую программу, я смогу реализовать многопроцессорность и создать объект пула.Почему это работает в одной программе, а не в другой.Вот моя тестовая программа, которая работает:
from multiprocessing import Pool
import types
import copy_reg
def _pickle_method(method):
func_name = method.im_func.__name__
obj = method.im_self
cls = method.im_class
return _unpickle_method, (func_name, obj, cls)
def _unpickle_method(func_name, obj, cls):
for cls in cls.mro():
try:
func = cls.__dict__[func_name]
except KeyError:
pass
else:
break
return func.__get__(obj, cls)
class Myclass(object):
def mult(self):
d = Data()
# This works in this test program but this call in my actual
# program doesn't work. The actual program is to large and
# complex to paste into this posting.
pool = Pool(processes=4)
result = pool.map(self.myfunc, zip(d.lx, d.ly))
pool.close()
pool.join()
def call_mult(self):
self.mult()
def myfunc(self, elements):
x, y = elements
v = 0
for z in xrange(x):
v += z
v = v * y
v = v - x
return v
class Data(object):
def __init__(self):
lx = []
ly = []
for x in range(100, 1000):
for y in range(10, 500):
lx.append(x)
ly.append(y)
self.lx = lx
self.ly = ly
if __name__ == "__main__":
copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method)
myobj = Myclass()
myobj.call_mult()
Я пытался сделать тестовую программу максимально приближенной к моей реальной программе.Вот почему у меня есть все объекты и функции травления.Таким образом, я могу привязать метод из объекта к методу многопроцессорной карты.В любом случае, мне просто интересно, почему вызов пула приведет к ошибке импорта в одном случае, а не в другом?Я постараюсь получить уменьшенную версию моей настоящей программы, которая не может быть опубликована.
Вся трассировка стека выглядит так:
Traceback (most recent call last):
File "/home/gxh6506/dev/fpc/srxfpc.py", line 137, in <module>
main()
File "/home/gxh6506/dev/fpc/srxfpc.py", line 95, in main
pool = Pool(processes=3)
File "/usr/local/lib/python2.7/multiprocessing/__init__.py", line 232, in Pool
return Pool(processes, initializer, initargs, maxtasksperchild)
File "/usr/local/lib/python2.7/multiprocessing/pool.py", line 138, in __init__
self._setup_queues()
File "/usr/local/lib/python2.7/multiprocessing/pool.py", line 233, in _setup_queues
from .queues import SimpleQueue
File "/usr/local/lib/python2.7/multiprocessing/queues.py", line 48, in <module>
from .synchronize import Lock, BoundedSemaphore, Semaphore, Condition
File "/usr/local/lib/python2.7/multiprocessing/synchronize.py", line 59, in <module>
" function, see issue 3770.")
ImportError: This platform lacks a functioning sem_open implementation, therefore, the required synchronization primitives needed will not function, see issue 3770.