Closed GES-mpalermo closed 2 years ago
@GES-lbabetto prova a vedere se funziona!
Invece di dare in pasto a JobDispatcher una lista di funzioni, bisogna dargli una lista di oggetti Job.
from jobdispatcher import JobDispatcher, Job
def test_function(a, text="sometext"):
print(f"I run, {a}, {text}")
jobs = [Job(function=test_function, arguments=[5]) for i in range(2)]
jobs[0].keyword_arguments = {"text": "bau"}
jd = JobDispatcher(jobs)
results = jd.run()
Nel caso la funzione che vogliamo usare è un metodo di un oggetto, abbiamo visto che purtroppo eventuali modifiche all'oggetto non si propagano perché multiprocessing lavora su una copia del processo python. Un workaround easy può essere di wrappare le operazioni dell'oggetto in una funzione che ritorna l'oggetto modificato!
from jobdispatcher import JobDispatcher, Job
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return str(self.age)+str(self.name)
def test_function(person):
person.name += "_mod"
person.age += 1
return person
newperson1 = Person("Paolo", 34)
newperson2 = Person("Giacomo", 27)
people = [newperson1, newperson2]
jobs = [ Job(function=test_function, arguments=[person]) for person in people ]
jd = JobDispatcher(jobs)
results = jd.run()
2 richieste:
Sarebbe possibile impostare una flag "verbose" che opzionalmente stampa le informazioni sul tempo di run di ciascun job? Perché al momento l'output dei calcoli è sovrapposto a quello di JobDispatcher. Magari potrebbe essere utile redirezionare l'output di JobDispatcher a stderr invece di stdout come fa xTB, che ti stampa le informazioni "di calcolo" in un file di "errore" con ad esempio "normal termination of xTB". Ci sono controindicazioni nel fare questo?
Si può formattare l'output di queste informazioni sugli elapsed time in maniera più fluida? Innanzitutto mi sarebbe comodo poter impostare manualmente il nome del job, ad esempio dall'InChIKey in input, quindi una proprietà del tipo Job(jobname="default") dove il default è quello che c'è adesso (numero incrementale che non so da dove venga!). Inoltre non capisco cosa sono i due numeri per l'elapsed time, ad esempio in "Elapsed time for job 1: 0.015625, 0.31678175926208496", quali sono le unità di misura dei due numeri (immagino secondi?) e cosa significano i due numeri diversi?
@GES-lbabetto Ottime idee! Sono al di fuori dello scope della pull request però, quindi una volta terminati i test su un numero di molecole consistente (io ho provato con 10000 task "sleep" e non ho avuto problemi, ma meglio un real world case scenario), puoi procedere ad aprire una Issue così discutiamo come implementare?
Sembra tutto a posto!
Closes #7
Also introduced some checks on the requested number of cores and added a cleanup phase before running job to kill zombie processes from RunTime errors.