Я хочу написать скрипт на python, который может запускать параллельные процессы на двух вычислительных узлах кластера slurm.
Я пытался pexpect.spawn
node_list = {'cn000': 28, 'cn001': 28}
children, pid = [], 0
for node, ntasks in nnode_list.items():
pid_range = range(pid, pid + ntasks)
pid += ntasks
for worker in pid_range:
chile = pexpect.spawn(worker_command % worker)
children.append(child)
Однако после запуска сценария все установленные соединения (захваченные lsof -i | grep port_number
) являются одним из вычислительных узлов,нет соединений между двумя вычислительными узлами.
Поэтому я попытался pexpect.pxssh
для решения проблемы, я попробовал скрипт:
from pexpect import pxssh
from socket import gethostname
from getpass import getuser
connections, pid = [], 0
for node, ntasks in node_list.items():
pid_range = range(pid, pid + ntasks)
pid += ntasks
if node == gethostname():
children = []
for worker in pid_range:
child = pexpect.spawn(worker_command % worker)
children.append(child)
connections.append(children)
if node != gethostname():
ssh = pxssh.pxssh()
ssh.login(node, getuser())
for worker in pid_range:
ssh.sendline(worker_command % worker)
connections.append(ssh)
К сожалению, это не решает проблему, хотякомандная строка была отправлена ssh.sendline
, процессы не запущены.
Я знаю, srun
также может быть использован для написания скрипта, который может запускать параллельные процессы, как я могу синхронизировать процессы, запущенные srun
?