Python Executor - Truyền hàm với đối số là đối số

Aug 26 2020

Mục tiêu của tôi là tạo một hàm mà tôi có thể sử dụng để đo lường việc thực thi và sử dụng tài nguyên của một hàm khác. Sử dụng một hướng dẫn, tôi đã tạo phần bên dưới bằng ThreadPoolExecutor của 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))

Nếu tôi chuyển hàm foo làm đối số cho hàm thực thi , nó sẽ in kết quả chính xác và trả về giá trị do foo trả về.

Nếu tôi truyền thanh chức năng theo cách tương tự, nhưng với chính thanh này yêu cầu đối số, thì hàm sẽ chạy (in 3 lần) và sau đó tôi gặp lỗi sau:

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

Sau một số thử nghiệm, phần mà tôi bị mắc kẹt dường như đang chuyển một hàm làm đối số, nếu bản thân hàm đó yêu cầu một đối số. Như tôi hiểu ThreadPoolExecutor, đối tượng fn_thread đóng gói việc thực thi hàm được gửi. Các kết quả đối tượng đơn giản nên giữ kết quả thực hiện đó - những gì tôi thiếu điều này không thể xử lý được thông qua một chức năng với một cuộc tranh cãi?

Trả lời

3 AleksJ Aug 26 2020 at 15:08

Bạn đang gửi

bar(0) 

thay vì

bar, 0

Để làm rõ, hãy nhìn vào chữ ký của người gửi: submit (fn, * args, ** kwargs)

kết quả của

bar(0)

là một số nguyên và trình thực thi không thể gọi một số nguyên, vì nó không phải là 'có thể gọi được', như thông báo lỗi gợi ý.