Почему многопроцессорная реализация пула работает в одной программе, но получает ImportError в другой? - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь использовать многопроцессорный пакет и внедрить пул, но получаю сообщение об ошибке:

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.
...