Мне нужно запустить кучу гибридных стохастических/детерминированных симуляций реакционных сетей с алгоритмами, указанными в class Markov
. Id нравится делать это параллельно и записывать все выходные данные в один файл, который прост в использовании в дальнейшем анализе. На данный момент я сохраняю его в файлах npz. При создании экземпляра Markov
в подчиненном процессе возникает ошибка: global name 'Markov' is not defined
. Итак, вопрос: как я могу сделать экземпляр Markov
в моих подчиненных процессах? Более подробные (общие) вопросы указаны ниже кода.Многопроцессорность, создание экземпляра и передача экземпляров функций
import numpy as np
import pathos.multiprocessing as mp
class Markov(object):
def __init__(self,SRN_name,rates,stoich_mat):
self.S=stoich_mat
self.SRN_name=SRN_name #SRN = Stochastic Reaction Network
self.rates=rates
self.nr_reactions=rates.shape[1]
def worker(SRN_name,rates,stoich_mat,init_state,tf,species_continuous):
result = []
try:
sim=Markov(SRN_name=SRN_name,rates=rates,stoich_mat=stoich_mat)
except Exception as e:
print e
result=None #here some methods of sim are executed
return result
def handle_output(result):
data=np.load("niks.npz").files
data.append(result)
np.savez("niks",data)
if __name__ == '__main__':
def sinput(t,amplitude=6.0,period=0.05,offset=1.0):
return amplitude*np.sin(period*t)+amplitude+offset
phospho_cascade=np.array(
[[ 0, 0, 0, 0, 0, 0, 0, 0], # input
[-1, 1, 0, 0, 0, 0, 0, 0]])# A
phospho_rates=np.array([(0.2,0),2.0],dtype=object,ndmin=2)
phspho_init=np.array([sinput,5.0],ndmin=2).T
tf=1.0
S_C=[0]
np.savez("niks",stoich_mat=phospho_cascade,rates=phospho_rates,init_state=phspho_init)
kwargs={"SRN_name":"niks","rates":phospho_rates,"stoich_mat":phospho_cascade,"init_state":rates,"tf":tf,"species_continuous":S_C}
pool = mp.Pool(processes=mp.cpu_count())
for i in range(2):
pool.apply_async(worker,kwds=kwargs,callback=handle_output)
pool.close()
pool.join()
Спасибо!
Эй, скорее, используйте многопроцессорность, так как Threading ограничен GIL. – Patrickens