У меня есть программа на python, которая обрабатывает простые числа, которые я настроил с помощью mpi4py, для запуска на моем кластере raspberry pi, и я обычно могу запустить команду из любого каталога, но когда я помещаю ее в rc.local, онане работает.Я могу нормально запустить файл rc.local из командной строки, а затем он запускается как следует.
Я подключаюсь к своему Raspberry pi через ssh, но на данный момент я не подключен к нему, иначе я бы подключилсямонитор к нему, чтобы проверить наличие сообщений об ошибках при загрузке.Я настроил переадресацию портов на нашем домашнем wifi и изменил порт по умолчанию для ssh, чтобы сделать его более безопасным.
команда внутри файла rc.local:
mpiexec -n 16 -f /home/pi/machinefile python3 /home/pi/clusterprime.py
код для разработкипростые числа:
from mpi4py import MPI
def innit():
#setting gloabl variables:
global comm
global rank
global size
global name
#setting up mpi4py:
comm = MPI.COMM_WORLD
rank = comm.rank
size = comm.size
name = comm.name
#checking if thread is master or slave:
if rank == 0:
mastersetup()
main()
def master(thread):
global n
global nLock
global cLock
global primes
global c
print("Started thread: {}".format(thread))
t = time.time()
while True:
with nLock:
n+=2
comm.send(n, dest=thread)
num, p = comm.recv(source=thread)
if p:
times.append(time.time()-t)
t = time.time()
print(num)
primes.append(num)
with cLock:
c+=1
def mastersetup():
#setting global module variables:
global time
#master setup:
import pickle
import threading
import time
#setting global pickle variables:
global prime
global n
global primes
primes = pickle.load(open("/home/pi/primes/primes.p", "rb"))
n = primes[len(primes)-1]
#setting global threading variables:
global nLock
global cLock
global c
global times
nLock = threading.Lock()
cLock = threading.Lock()
threads = []
c = 0
times = []
t = 0
for x in range(1,size):
threads.append(threading.Thread(target=master, args=[x]))
for x in threads:
x.daemon = True
x.start()
while True:
if c >= size*5:
t = 0
with cLock:
c = 0
pickle.dump(primes,open("/home/pi/primes/primes.p", "wb"))
for x in times:
t+=x
t = t/len(times)/size
print(t)
t = []
while len(primes) >= 200:
primes.remove(primes[0])
def main():
while True:
n = comm.recv(source=0)
p = isprime(n)
comm.send((n, p), dest=0)
def isprime(num):
for n in range(3, round(num/2),2):
if num%n == 0:
return(False)
return(True)
if __name__ == "__main__":
innit()