Python 对模块使用多处理
我正在编写一个模块,以便在一个函数中使用Python 3.6中多处理库中的Pool函数。我已经对这个问题做了一些研究,似乎您不能使用ifPython 对模块使用多处理,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
\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,但仍然出现了错误。我不认为这是我自己的问题,因为一旦我在不进行多重处理的情况下完成了这项工作,它就会很好地工作。我要说的是,我已经用类似但不完全相同的代码运行了测试,而且一切都正常。我会看看我能不能把代码发出去。