Python Executor - Passaggio di una funzione con argomento come argomento

Aug 26 2020

Il mio obiettivo è creare una funzione che posso utilizzare per misurare l'esecuzione e l'utilizzo delle risorse di un'altra funzione. Utilizzando un tutorial, ho creato quanto segue utilizzando ThreadPoolExecutor di Python:

from resource import *
from time import sleep
from concurrent.futures import ThreadPoolExecutor

class MemoryMonitor:
    def __init__(self):
        self.keep_measuring = True

    def measure_usage(self):
        max_usage = 0
        u_run_time = 0
        s_run_time = 0
        while self.keep_measuring:
            max_usage = max(max_usage, getrusage(RUSAGE_SELF).ru_maxrss)
            u_run_time = max(u_run_time, getrusage(RUSAGE_SELF).ru_utime) 
            s_run_time = max(s_run_time, getrusage(RUSAGE_SELF).ru_stime) 
        sleep(0.1) # run this loop every 0.1 seconds
        return [max_usage, u_run_time, s_run_time]

def execute(function):
    with ThreadPoolExecutor() as executor:
        monitor = MemoryMonitor()
        stats_thread = executor.submit(monitor.measure_usage)
        try:
            fn_thread = executor.submit(function)
            result = fn_thread.result()
            print("print result")
            print(result)
            print("print result type")
            print(type(result))
        finally:
            monitor.keep_measuring = False
            stats = stats_thread.result()
        print(stats)
        return result

def foo():
    i = 0
    while i < 3:
        print("foo")
        i+=1
    return 1

def bar(x):
    while x < 3:
        print("foobar")
        x+=1
    return 1

var = execute(foo)
print("Var = " + str(var))
var = execute(bar(0))
print("Var = " + str(var))

Se passo la funzione foo come argomento alla funzione execute , stampa i risultati corretti e restituisce il valore restituito da foo.

Se passo la barra delle funzioni nello stesso modo, ma con la barra stessa che richiede un argomento, la funzione viene eseguita (stampa 3 volte) e quindi ottengo il seguente errore:

result = self.fn(*self.args, **self.kwargs)
TypeError: 'int' object is not callable

Dopo alcuni test, la parte in cui sono bloccato sembra passare una funzione come argomento, se quella funzione stessa richiede un argomento. Da quanto ho capito ThreadPoolExecutor, l' oggetto fn_thread incapsula l'esecuzione della funzione inviata. L' oggetto risultato dovrebbe semplicemente contenere il risultato di quell'esecuzione - cosa mi manca che questo non possa gestire il passaggio di una funzione con un argomento?

Risposte

3 AleksJ Aug 26 2020 at 15:08

Stai inviando

bar(0) 

invece di

bar, 0

Per chiarire, guarda la firma del submit: submit (fn, * args, ** kwargs)

il risultato di

bar(0)

è un numero intero e l'esecutore non può chiamare un numero intero, poiché non è "richiamabile", come suggerisce il messaggio di errore.