2014-12-10 3 views
0

Мы хотим запустить некоторые фоновые процессы в нашем приложении Django. Кажется, что сельдерей - самое распространенное решение, но наша команда больше знакома с MPI, поэтому я экспериментирую с ним. Я хотел бы создать команду администратора Django, которая запускает пул сотрудников MPI, поэтому я прочитал Django admin commands и MPI4py dynamic process management.Запуск рабочих процессов MPI в приложении Django

Я написал команду администратора, чтобы запустить диспетчер флота и команду администратора для запуска рабочего. Менеджер флота успешно использует MPI.COMM_SELF.Spawn() для запуска рабочих, но они не могут общаться друг с другом. Менеджер и первый работник имеют ранг 0, поэтому похоже, что они используют отдельные коммуникаторы.

Как я могу заставить менеджера и работников использовать один и тот же коммуникатор?

ответ

0

Хитрость заключается в объединении двух коммуникаторов, как описано в this answer to a C question. С некоторой помощью MPI4py documentation, я преобразовал его в Python:

команда
# myproject/myapp/management/commands/runfleet.py 
from mpi4py import MPI 
from optparse import make_option 

from django.core.management.base import BaseCommand 

import sys 

class Command(BaseCommand): 
    help = 'Launches the example manager and workers.' 

    option_list = BaseCommand.option_list + (
     make_option('--workers', '-w', type='int', default=1),) 

    def handle(self, *args, **options): 
     self.stdout.write("Manager launched.") 

     worker_count = options['workers'] 
     manage_script = sys.argv[0] 
     comm = MPI.COMM_SELF.Spawn(sys.executable, 
            args=[manage_script, 'fleetworker'], 
            maxprocs=worker_count).Merge() 
     self.stdout.write('Manager rank {}.'.format(comm.Get_rank())) 

     start_data = [None] # First item is sent to manager and ignored 
     for i in range(worker_count): 
      start_data.append("Item {}".format(i)) 
     comm.scatter(start_data) 

     end_data = comm.gather() 
     self.stdout.write('Manager received data {!r}.'.format(end_data)) 

     comm.Disconnect() 

Работник выглядит следующим образом:

# myproject/myapp/management/commands/fleetworker.py 
from mpi4py import MPI 

from django.core.management.base import BaseCommand 

class Command(BaseCommand): 
    help = 'Example worker process.' 

    def handle(self, *args, **options): 
     self.stdout.write("Worker launched.") 

     comm = MPI.Comm.Get_parent().Merge() 
     rank = comm.Get_rank() 
     self.stdout.write('Worker rank {}.'.format(rank)) 

     data = comm.scatter() 
     result = "{!r}, {!r}".format(rank, data) 

     comm.gather(result) 
     self.stdout.write("Finished worker.") 

     comm.Disconnect() 
Смежные вопросы