所以,这是我的情况。'if __name__ =='后面的任何内容__main__“:'不执行
我在Eclipse中使用PyDev,Windows中的Python解释器版本2.7.2。
我正在使用内置的多处理库试图分离出一堆进程来并行化一个非常计算密集型的循环。我看了看教程说来使用,
if __name__ == "__main__":
,以防止它产卵关闭接近无限的流程和把我的系统瘫痪,本质上。
问题是,我从一个模块调用它,而不是我的主脚本;因此,在EVER执行后没有任何东西。完全没有并行的机会。当然,如果我删除它,我会收到杀死执行代码的机器的infiniprocess垃圾邮件。
作为参考的缘故,这里的相关代码:
from tribe import DataCache
from tribe import WorldThread
from tribe import Actor
from time import sleep
import multiprocessing
class World:
def __init__(self,numThreads,numActors,tickRate):
print "Initalizing world..."
self.cache = DataCache.DataCache()
self.numThreads = numThreads
self.numActors = numActors
self.tickRate = tickRate
self.actors = []
self.processes = []
for i in range(numActors):
self.actors.append(Actor.Actor("test.xml",self.cache))
print "Actors loaded."
def start_world(self):
print "Starting world"
run_world = True;
while run_world:
self.world_tick()
sleep(2)
def world_tick(self):
if __name__ == '__main__':
print "World tick"
actor_chunk = len(self.actors)/self.numThreads
if len(self.processes)==0:
for _ in range(self.numThreads):
new_process = multiprocessing.Process(WorldThread.WorldProcess.work, args=(_, self.actors[_*actor_chunk,(_+1)*actor_chunk]))
而且它调用类:
class WorldProcess():
def __init__(self):
print "World process initilized."
''' Really, I'm not sure what kind of setup we'll be doing here yet. '''
def work(self, process_number, actors):
print "World process" + str(process_number) + " running."
for actor in actors:
actor.tick()
print "World process" + str(process_number) + " completed."
我是在我的评估纠正,如果整个名 ==“主要“:只有在可执行脚本本身包含它时才检查是否有效?如果是这样,你如何安全地从模块中分离进程?如果没有,为什么它不在这里工作?
调用'multiprocessing.Process(WorldThread.WorldProcess.work,...)'看起来很可疑。你正在调用一个类的实例方法,但我不认为多处理模块会为你实例化它。您也没有像文档中指出的那样使用关键字参数调用方法 - “Process”的第一个参数是不应该被忽略的参数。 – millimoose 2012-02-05 22:36:56
哎呀,我肯定在那里犯了一个错误 - 我应该把目标= WorldThread.WorldProcess ...等等。另外,我见过的所有例子(并且承认它们是有限的)已经调用了来自导入的方法类没有实例化这些类,所以我怀疑这是问题。然而,我遇到的真正问题是,name == main检查后面的任何内容都没有执行。我真正想要的是对这一点的澄清,以及如何从模块内安全地进行多进程。 – Laereom 2012-02-05 22:50:07
'if __name __ ==“__ main __”'是您在将成为入口点的脚本的根级别执行的操作。它是一种只有在脚本直接执行时才能做的事情。 – jdi 2012-02-05 22:50:55