对模块使用多处理

时间:2018-01-08 16:48:21

标签: python multiprocessing

我正在编写一个模块,以便在一个函数中我想使用Python 3.6中多处理库中的Pool函数。我已经对这个问题进行了一些研究,似乎你不能使用if __name__=="__main__",因为代码没有从main运行。我还注意到python池进程在我的任务管理器中初始化但基本上被卡住了。

例如:

class myClass()
    ...
    lots of different functions here
    ...
    def multiprocessFunc()
        do stuff in here
    def funcThatCallsMultiprocessFunc()
        array=[array of filenames to be called]
        if __name__=="__main__":
            p = Pool(processes=20)
            p.map_async(multiprocessFunc,array)

我试图移除if __name__=="__main__"部分,但仍然没有骰子。任何帮助都会赞赏。

2 个答案:

答案 0 :(得分:1)

在我看来,您刚刚错过了代码中的self.。我认为这会奏效:

class myClass():
    ...
    # lots of different functions here
    ...
    def multiprocessFunc(self, file):
        # do stuff in here
    def funcThatCallsMultiprocessFunc(self):
        array = [array of filenames to be called]
        p = Pool(processes=20)
        p.map_async(self.multiprocessFunc, array)  #added self. here

现在已经完成了一些实验,我发现map_async可能需要相当长的时间才能启动(我认为因为多处理会创建进程)而且任何测试代码都可能调用funcThatCallsMultiprocessFunc然后在Pool之前退出{1}}已经开始了。

在我的测试中,我必须在funcThatCallsMultiprocessFunc之后等待超过10秒才开始调用multiprocessFunc。但一旦开始,他们似乎运行得很好。

这是我用过的实际代码:

<强> MyClass.py

from multiprocessing import Pool

import time
import string

class myClass():
    def __init__(self):
        self.result = None
    def multiprocessFunc(self, f):
        time.sleep(1)
        print(f)
        return f
    def funcThatCallsMultiprocessFunc(self):
        array = [c for c in string.ascii_lowercase]
        print(array)
        p = Pool(processes=20)
        p.map_async(self.multiprocessFunc, array, callback=self.done)
        p.close()
    def done(self, arg):
        self.result = 'Done'
        print('done', arg)

<强> Run.py

from MyClass import myClass

import time

def main():
    c = myClass()
    c.funcThatCallsMultiprocessFunc()
    for i in range(30):
        print(i, c.result)
        time.sleep(1)

if __name__=="__main__":
    main()

答案 1 :(得分:0)

x构造是一种导入保护。您想要使用它,以阻止n在导入时运行您的设置。

在您的情况下,您可以在课程设置中省略此保护。一定要保护调用文件中类的执行点,如下所示:

if __name__=='__main__'