Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用类函数的Python多处理_Python_Oop_Parallel Processing_Multiprocessing - Fatal编程技术网

调用类函数的Python多处理

调用类函数的Python多处理,python,oop,parallel-processing,multiprocessing,Python,Oop,Parallel Processing,Multiprocessing,我正在尝试多处理大量需要调用类函数的对象。我无法将该函数拉到类之外,因此只需要找出一种方法来加速该函数的调用 非常感谢 import time # - Bespoke Class that is standalone - # class sub_class: def __init__(self, item_id, assumptions = "BlahBlahBlah"): self.item_id = item_id self.assumptions

我正在尝试多处理大量需要调用类函数的对象。我无法将该函数拉到类之外,因此只需要找出一种方法来加速该函数的调用

非常感谢

import time

# - Bespoke Class that is standalone - #
class sub_class:
    def __init__(self, item_id, assumptions = "BlahBlahBlah"):
        self.item_id = item_id
        self.assumptions = assumptions
        self.test_count = 0

    def some_func(self, adder=1):
        self.test_count += adder
        time.sleep(0.1)


# - initialise a list of classes - #
item_ids = ['A', 'B', 'C', 'D']
items = [sub_class(_id) for _id in item_ids]

print( sum(_item.test_count for _item in items) )
# Prints out 0

# - invoke a class level function - #
[_item.some_func(adder=2) for _item in items]

print( sum(_item.test_count for _item in items) )
# Prints out 8

这只需对某些_func()做一个小的更改即可


“items”被复制到新进程中,因此您必须使用future return()值。因此,在
wait()

之后的某个时刻,您可以使用
items=[future.result()for future in future\u list]
替换原始项目,这是否回答了您的问题?这很好用,正是我想要的。(我加了一个小进度条,它工作起来很有魅力)也许,我不应该那么匆忙:你会如何存储新的输出?e、 g.执行以下打印0 tmp_列表=[future.result().test_count for future in future_list]打印(总和(tmp_列表))是否确定?它为我打印了8张。另请参见我的答案编辑。抱歉,这很有效;我修改了一些东西,并在MyClass.some_func中省略了“返回自我”部分(尽管你的评论是不要忘记它)。谢谢
import time
from concurrent.futures import ProcessPoolExecutor, wait, ALL_COMPLETED


# - Bespoke Class that is standalone - #
class MyClass:
    def __init__(self, item_id, assumptions="BlahBlahBlah"):
        self.item_id = item_id
        self.assumptions = assumptions
        self.test_count = 0

    def some_func(self, adder=1):
        self.test_count += adder
        print(f"{self.item_id} executing some_func()")
        time.sleep(0.1)
        # note: we must return ourselves
        return self


# Don't omit this on Windows
if __name__ == '__main__':

    # - initialise a list of classes - #
    item_ids = ['A', 'B', 'C', 'D']
    items = [MyClass(item_id) for item_id in item_ids]

    print(sum(item.test_count for item in items))
    # Prints out 0

    # - invoke a class level function - #
    with ProcessPoolExecutor(max_workers=4) as executor:
        future_list = []
        for item in items:
            future_list.append(executor.submit(item.some_func, adder=2))

        wait(future_list, return_when=ALL_COMPLETED)

        # note: we must use the returned self to get the test count
        print(sum(future.result().test_count for future in future_list))
        # Prints out 8

        # note: the original items haven't changed
        print(sum(item.test_count for item in items))
        # Prints out 0