Python Executor-인수로 함수 전달

Aug 26 2020

내 목표는 다른 함수의 실행 및 리소스 사용을 측정하는 데 사용할 수있는 함수를 만드는 것입니다. 튜토리얼을 사용하여 Python의 ThreadPoolExecutor를 사용하여 아래를 만들었습니다.

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))

함수 execute에 인수로 foo 함수를 전달하면 올바른 결과를 인쇄하고 foo에서 반환 한 값을 반환합니다.

동일한 방식으로 함수 막대 를 전달 하지만 인수가 필요한 막대 자체가 있으면 함수가 실행되고 (3 번 인쇄) 다음 오류가 발생합니다.

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

몇 가지 테스트 후, 함수 자체에 인수가 필요한 경우 내가 갇힌 부분은 함수를 인수로 전달하는 것처럼 보입니다. ThreadPoolExecutor를 이해하면 fn_thread 객체는 제출 된 함수의 실행을 캡슐화합니다. 결과 단순히 실행 결과를 저장한다 객체 -이 처리 할 수없는 실종 무엇 인수로 함수를 전달되는?

답변

3 AleksJ Aug 26 2020 at 15:08

제출 중입니다.

bar(0) 

대신에

bar, 0

명확히하기 위해 제출자의 서명을보십시오 : submit (fn, * args, ** kwargs)

결과

bar(0)

는 정수이고 실행 프로그램은 오류 메시지에서 알 수 있듯이 '호출 가능'이 아니기 때문에 정수를 호출 할 수 없습니다.