Многопроцессорный массив .get_lock работает на одном компьютере, но не на другом

#python #multiprocessing #counter #python-pool

#python #многопроцессорная обработка #счетчик #python-пул

Вопрос:

Я работаю над несколько обширной программой на Python, которая использует многопроцессорную обработку. Поскольку я хотел, чтобы пользователь видел некоторый прогресс на консоли при запуске программы, я прочитал об использовании общего счетчика в stackoverflow, и через некоторое время, поиграв с моим кодом, я заставил его работать. Как я уже сказал, слишком много кода для публикации здесь, но суть в том, что я создаю экземпляр многопроцессорного массива после name==main line ,

 if __name__ == "__main__":
    total_progress_counter = Array('i',[0,0])
  

а затем во время основной части кода я передаю этот массив функции в другом модуле:

 some_name.plot(<other variables>,
               total_progress_counter=total_progress_counter)
  

Затем в этой другой функции я использовал .get_lock метод, который я нашел описанным здесь в stackoverflow:

 with total_progress_counter.get_lock():
    total_progress_counter[0]  = self.total_panels_to_plot
  

Я также обновляю другой компонент, total_progress_counter[1] , в той же функции. Это отлично работает для меня на моей рабочей машине, где я написал код, и на этой машине установлена операционная система Centos.

Но когда я запускаю его на своем личном MacBook, он выдает следующую трассировку:

 Traceback (most recent call last):
  File "./program.py", line 775, in <module>
    program.run()
  File "./program.py", line 177, in run
    cases_plotted = pool.map(self.__plot__, all_cases)
  File "/opt/anaconda3/lib/python3.8/multiprocessing/pool.py", line 364, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "/opt/anaconda3/lib/python3.8/multiprocessing/pool.py", line 771, in get
    raise self._value
AttributeError: 'list' object has no attribute 'get_lock'
  

У меня есть python3 версии 3.8.3 на моей личной машине и python3 версии 3.7.4 на моей рабочей машине. Кто-нибудь может помочь мне понять, почему я получаю разное поведение в этих двух средах? Я был бы благодарен, поскольку это должно быть программное обеспечение, которое другие могут использовать на разных машинах.

Комментарии:

1. У A multiprocessing.Array , безусловно, есть метод get_lock() на моем MBP, работающий под управлением 3.8. Можете ли вы распечатать значение total_progress_counter перед вызовом get_lock() ? Сообщение об ошибке заставляет меня думать, что его значение — это что-то другое.

2. На самом деле, я смог заставить его работать как на моем домашнем, так и на рабочем компьютерах после того, как понял, что не инициализировал оператор пула ( Pool(initializer=<something>,initargs=(<something>,)) т. Е. Я не уверен, почему код работал без этого на моей рабочей машине, но, надеюсь, это общее исправление.

3. Просто для моих собственных общих знаний. Вы проводили эксперимент по распечатке, total_progress_counter пропустив инициализацию? Полезно знать, как происходит сбой.

4. Да, я пробовал это, и он печатал [0,0] , поскольку он был изначально инициализирован (до того, как я исправил создание экземпляра Pool .