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