Есть ли многопроцессорная обработка.Класс, подобный менеджеру, в mpi4py?

#python #mpi #mpi4py

Вопрос:

У меня есть очередь, которую я хочу разделить между несколькими процессами, которые я запускаю при выполнении трудоемкой части моего кода. Я замечаю, что когда я передаю multiprocessing.Manager.Queue объект функции, которую хочу вызвать, он просто застревает там, а затем завершает все процессы без вызова этой функции. Я также попытался передать Queue объект, полученный из Python, но поведение невыполнения функции сохраняется. Мне интересно, есть ли Queue объект, которым можно поделиться при запуске распараллеливания MPI?

Оператор «В функции» будет отображаться только в том случае, если я удален queue из iterable списка и из func параметров. Это относится к Queue многопроцессорной обработке Python и’.Менеджер.Очередь».

Кроме того, я не уверен, является ли MPI.Win.Lock() это правильным подходом или нет. У меня не было возможности проверить его, так как он никогда туда не ходит.

            import queue as q
           from mpi4py.futures import MPIPoolExecutor
           from mpi4py import MPI

           def func(data, queue):
               print("In func")
               tmp = othe_function(data)
               with MPI.Win.Lock():
                  print("in queue")
               writer(queue, [g_indxs, sparse.csr_matrix(tmp)])
              MPI.Win.Unlock()
               #other stuff
             
           queue = q.Queue()
           iterable = [(data, queue) for i in unique_schaefer_labels]
           with MPIPoolExecutor() as executor:
               print(executor)
               executor.starmap(func, iterable)
           print("done")