2016-12-13 2 views
1

Мне нужно запустить кучу гибридных стохастических/детерминированных симуляций реакционных сетей с алгоритмами, указанными в 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() 

Спасибо!

ответ

0

Чтобы ответить на вторую часть вашего вопроса, да, есть намного более простые способы многопроцессорности. Я бы рекомендовал попробовать ваш код снова, но с помощью модуля «threading». Пример нарезания резьбы выглядит следующим образом:

import threading 

#Just define any functions you'd like to thread: 
def RandomFunction(): 
    print('Hello World') 

#Now create the thread(s) as so: 
threadName = threading.Thread(target = RandomFunction , args =()) 

#Now start the threads. You may also use threadName.join(), if you'd like to wait for a thread to complete, before continuing. 
threadName.start() 

Используя тот же синтаксис, вы можете создавать темы для как много функций, как вы хотите, и запустить их одновременно. И поверьте мне, это намного проще! :)

+2

Эй, скорее, используйте многопроцессорность, так как Threading ограничен GIL. – Patrickens

 Смежные вопросы

  • Нет связанных вопросов^_^