我正在编写一个模块,以便在一个函数中我想使用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__"
部分,但仍然没有骰子。任何帮助都会赞赏。
答案 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__'