0

After having read a similar problem(Executing same Python program with different arguments in parallel) posed by some user at SO, I tried my own code for launching a python program with different argument in different cores. However I am running into trouble. My main problem here is, my function takes 11 arguments and when I provide those arguments in the form of a list, it says I am passing only one argument.

from main_program import sliding_solver
from multiprocessing import Pool
import glob,shutil
from const_for_drdo_adaptive_split import *
#The file- const_for_drdo_adaptive defines all the parameters for used in this file
C1=[-5,-2.5,0,2.5,5];spr1=2.5;LR1=[10,20,30,30,30]
C2=[-4,-3,-2,-1,0,1,2,3,4];spr2=1;LR2=[30,40,50,50,50]
C3=[-4,-2,0,2,4];spr3=2;LR3=[40,50,60,60,60]
par=[[spr1,LR1,C1],[spr2,LR2,C2],[spr3,LR3,C3]]
#0,x0,1e-2,T,tim,So,C,spr,LR,num,param
init_cond=[]
for i in range(len(par)):
    theta11=np.zeros(5*len(par[i][2])**num)
    x0=np.concatenate((x10,theta11),axis=0) #x10 is an array of 9 elements
    init_cond.append(x0)

#theta1=np.zeros(5*len(C)**num)
#x0=np.concatenate((x10,theta1),axis=0 )
print x0
arg=[[0,init_cond[0],1e-2,T,tim,So,C1,spr1,LR1,num,param],[0,init_cond[1],1e-2,T,tim,So,C2,spr2,LR2,num,param],[0,init_cond[2],1e-2,T,tim,So,C3,spr3,LR3,num,param]]
if __name__=='__main__':
    pool=Pool(4)
    results=pool.map(sliding_solver,zip(arg[0],arg[1],arg[2]))
    for file in glob.glob("*_"+str(par[i][0])+"*"):
        shutil.move(file,"results")

I wish to know how can I pass three different instances of 11 arguments to my function and launch it in different cores parallely. Kindly help. Thanks in advance!

[ 0.5  0.   0.  ...,  0.   0.   0. ]
Traceback (most recent call last):
  File "parallel_adaptive_split.py", line 23, in <module>
    results=pool.map(sliding_solver,zip(arg[0],arg[1],arg[2]))
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 567, in get
    raise self._value
TypeError: sliding_solver() takes exactly 11 arguments (1 given)

1 Answer 1

0

Instead of using pool, I solved my problem by creating three different processes and then starting the processes and finally joining them.

from main_program import sliding_solver
from multiprocessing import Pool
import glob,shutil
from const_for_drdo_adaptive_split import *
from multiprocessing import Process
C1=[-5,-2.5,0,2.5,5];spr1=2.5;LR1=[10,20,30,30,30]
C2=[-4,-3,-2,-1,0,1,2,3,4];spr2=1;LR2=[30,40,50,50,50]
C3=[-4,-2,0,2,4];spr3=2;LR3=[40,50,60,60,60]
par=[[spr1,LR1,C1],[spr2,LR2,C2],[spr3,LR3,C3]]
#0,x0,1e-2,T,tim,So,C,spr,LR,num,param
init_cond=[]
for i in range(len(par)):
    theta11=np.zeros(5*len(par[i][2])**num)
    x0=np.concatenate((x10,theta11),axis=0)
    init_cond.append(x0)

#theta1=np.zeros(5*len(C)**num)
#x0=np.concatenate((x10,theta1),axis=0 )
print x0
arg=[[0,init_cond[0],1e-2,T,tim,So,C1,spr1,LR1,num,param],[0,init_cond[1],1e-2,T,tim,So,C2,spr2,LR2,num,param],[0,init_cond[2],1e-2,T,tim,So,C3,spr3,LR3,num,param]]
if __name__=='__main__':
    #pool=Pool(3)
    #results=pool.map(sliding_solver,zip(arg[0],arg[1],arg[2]))
    p1=Process(target=sliding_solver,args=(0,init_cond[0],1e-2,T,tim,So,C1,spr1,LR1,num,param))
    p2=Process(target=sliding_solver,args=(0,init_cond[1],1e-2,T,tim,So,C2,spr2,LR2,num,param))
    p3=Process(target=sliding_solver,args=(0,init_cond[2],1e-2,T,tim,So,C3,spr3,LR3,num,param))
    p1.start()
    p2.start()
    p3.start()
    p1.join()
    p2.join()
    p3.join()

    for file in glob.glob("*_"+str(arg[i][0])+"*"):
        shutil.move(file,"results")
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.