GES-compchem / job-dispatcher

In-home wrapper around Multiprocessing to parallelize the execution of independent functions.
https://ges-compchem.github.io/job-dispatcher/
GNU General Public License v3.0
1 stars 4 forks source link

Now JobDispatcher can run functions with arguments via the Job class #8

Closed GES-mpalermo closed 2 years ago

GES-mpalermo commented 2 years ago

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.

GES-mpalermo commented 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()
lbabetto commented 2 years ago

2 richieste:

  1. 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?
  2. 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-mpalermo commented 2 years ago
  1. 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?

  2. 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?

lbabetto commented 2 years ago

Sembra tutto a posto!

lbabetto commented 2 years ago

Closes #7