似乎多处理器在线程之间交换得更快,所以我开始进行交换,但是我得到了一些意想不到的结果。它使我的整个脚本在线程之前没有循环几次。
摘录示例:
stuff_needs_done = true
more_stuff_needs_done = true
print "Doing stuff"
def ThreadStuff():
while 1 == 1:
#do stuff here
def OtherThreadStuff():
while 1 == 1:
#do other stuff here
if stuff_needs_done == true:
Thread(target=ThreadStuff).start()
if more_stuff_needs_done == true:
Thread(target=OtherThreadStuff).start()
这正如我所料。线程启动并运行直到停止。但是当运行很多这些开销更高时(所以我告诉我)所以我尝试了交换到多处理。
摘录示例:
stuff_needs_done = true
more_stuff_needs_done = true
print "Doing stuff"
def ThreadStuff():
while 1 == 1:
#do stuff here
def OtherThreadStuff():
while 1 == 1:
#do other stuff here
if stuff_needs_done == true:
stuffproc1= Process(target=ThreadStuff).start()
if more_stuff_needs_done == true:
stuffproc1= Process(target=OtherThreadStuff).start()
但似乎发生的事情是整个事情开始了几次,所以"做东西"输出出现并且有几个线程运行。
我可以放入一些.join()但是没有循环会导致打印输出再次运行,这意味着它无处可待。
我希望这只是一个语法问题,但我很难找到整个脚本循环的原因。我非常欣赏正确方向的任何指示。
答案 0 :(得分:1)
docs:
中提到了这一点安全导入主模块
确保新的Python解释器可以安全地导入主模块,而不会导致意外的副作用(例如 开始一个新的过程。)
例如,在运行Windows的情况下,以下模块将因RuntimeError而失败:
from multiprocessing import Process def foo(): print 'hello' p = Process(target=foo) p.start()
相反,应该使用
if __name__ == '__main__'
来保护程序的“切入点”:如下所示:from multiprocessing import Process, freeze_support def foo(): print 'hello' if __name__ == '__main__': freeze_support() p = Process(target=foo) p.start()
这允许新生成的Python解释器安全地导入模块,然后运行模块的
foo()
函数。