Python Executor-以参数为参数传递函数

Python Executor - Passing function with argument as argument(Python Executor-以参数为参数传递函数)
本文介绍了Python Executor-以参数为参数传递函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的目标是创建一个可以用来度量另一个函数的执行和资源使用情况的函数。通过教程,我已经使用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))

如果我将函数foo作为参数传递给函数Execute,它将打印正确的结果并返回foo返回的值。

如果我以相同的方式传递函数bar,但bar本身需要参数,则该函数运行(打印3次),然后收到以下错误:

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

经过一些测试后,如果函数本身需要参数,那么我遇到困难的地方似乎是将函数作为参数传递。根据我对ThreadPoolExecutor的理解,fn_线程对象封装了提交的函数的执行。Result对象应该只保留执行的结果--这不能处理传递带有参数的函数的问题吗?

推荐答案

您正在提交

bar(0) 

而不是

bar, 0
为澄清起见,请查看提交人的签名: 提交(fn,*args,**kwargs)

的结果
bar(0)

是一个整数,执行器无法调用该整数,因为如错误消息所示,该整数不可‘Callable’。

这篇关于Python Executor-以参数为参数传递函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)