Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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_Multiprocessing - Fatal编程技术网

Python 对模块使用多处理

Python 对模块使用多处理,python,multiprocessing,Python,Multiprocessing,我正在编写一个模块,以便在一个函数中使用Python 3.6中多处理库中的Pool函数。我已经对这个问题做了一些研究,似乎您不能使用if\uuuuu name\uuuu==“\uuuuu main\uuuu”,因为代码不是从main运行的。我还注意到,python池进程在我的任务管理器中得到初始化,但本质上被卡住了 例如: class myClass() ... lots of different functions here ... def multiproce

我正在编写一个模块,以便在一个函数中使用Python 3.6中多处理库中的Pool函数。我已经对这个问题做了一些研究,似乎您不能使用if
\uuuuu name\uuuu==“\uuuuu main\uuuu”
,因为代码不是从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)

我试图删除
如果uuuu name uuuu==“uuuu main”
部分,但仍然没有骰子。任何帮助都将不胜感激。

如果“名称”结构是一种进口保护,则
。您想使用它来停止
多处理
在导入时运行安装程序

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

def apply_async_with_callback():
    pool = mp.Pool(processes=30)
    for i in range(z):
        pool.apply_async(parallel_function, args = (i,x,y, ), callback = callback_function)
    pool.close()
    pool.join()
    print "Multiprocessing done!"

if __name__ == '__main__':
    apply_async_with_callback()

在我看来,您刚刚从代码中漏掉了一个
自我。
。我认为这会奏效:

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\u async
可能需要相当长的时间才能启动(我认为这是因为多处理创建了进程),任何测试代码都可能调用
functhattcallsMultiprocessfunc
,然后在
池启动之前退出

在我的测试中,在调用
multiprocessFunc
之前,我必须在调用
multiprocessFunc
之后等待10秒以上。但一旦启动,它们似乎运行得很好

这是我实际使用的代码:

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)
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()
Run.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)
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()

首先,将
if\uuuuu name\uuuuuu…
部分放在类定义之外。这样做的问题是,我希望池在该特定函数中初始化。此模块正在另一个程序中调用,即jupyter notebook,这行得通吗?我试过了,错误是函数缺少一个参数self。是的,请注意在我的回答中使用了
self
作为方法的参数。不,我在您声明添加self的地方添加了self,但仍然出现了错误。我不认为这是我自己的问题,因为一旦我在不进行多重处理的情况下完成了这项工作,它就会很好地工作。我要说的是,我已经用类似但不完全相同的代码运行了测试,而且一切都正常。我会看看我能不能把代码发出去。