Чтобы ответить на вопрос выше, я создал файл с именем app.py
и загрузил его в интерфейсный узел, к которому я мог подключиться по ssh. Этот файл описывает функцию, которую будут обрабатывать отдельные работники на разных серверах:
from celery import Celery
app = Celery('tasks',
backend='redis://daccssfe.crc.nd.edu:6379/0',
broker='redis://daccssfe.crc.nd.edu:6379/0')
@app.task
def log(*args):
# have all workers write their results to a common outfile
with open('/scratch365/dduhaime/celery-test.txt', 'a') as out:
out.write('-'.join([str(i).strip() for i in args]) + '\n')
Далее я определил функцию schedule_work.py
, которая планирует выполняемую работу:
'''Worker node; executes tasks outlined in app.py'''
from app import log
# run the add function and pass in arguments
for i in range(10000):
print('* processing', i)
result = log.apply_async(args=[str(i)]).get()
Этот файл создает 10 000 единиц работы и передает каждое целое число 0: 10000-1 в рабочую очередь. Когда работники выходят в сеть, они будут обрабатывать эту очередь.
Чтобы добавить рабочих, я использовал суперкомпьютерную систему моего университета, чтобы создать 10 рабочих, каждый из которых запускает файл app.py
, который заставит рабочего потреблять работу из стека. Для этого с помощью системы очередей Sun Grid Engine (суперкомпьютер, над которым я работаю, использует его в качестве протокола отправки задания), я сохранил следующее в файле start_workers.sh
:
#!/bin/bash
#$ -N celery
#$ -o logs/celery.log
#$ -t 1-10:1
#$ -pe smp 4
#$ -q long
#$ -r y
source ~/.bash_profile
source celery-env/bin/activate
# add a new worker
celery worker -l info -A app
Затем я отправил эти задания (qsub start_workers.sh
), в которых было занято 10 работников, каждый из которых вытягивал из списка выполняемых работ. В конце они все записали адрес своего хоста и аргумент из списка работ, которые необходимо выполнить, в запрошенный файл, к которому у них всех был доступ. Как видно из файла результатов, разные хосты из набора из 10 рабочих хостов потребляли разные входные данные:
# /scratch365/dduhaime/celery-test.txt content
10.32.77.210-0
10.32.77.210-1
10.32.77.132-2
10.32.77.210-3
10.32.77.142-4
10.32.77.132-5
10.32.77.210-6
10.32.77.192-7
10.32.77.116-8
10.32.77.142-9
10.32.77.132-10
...