Python多处理导致整个脚本循环

时间:2017-03-06 13:11:31

标签: python multithreading python-multithreading

似乎多处理器在线程之间交换得更快,所以我开始进行交换,但是我得到了一些意想不到的结果。它使我的整个脚本在线程之前没有循环几次。

摘录示例:

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()但是没有循环会导致打印输出再次运行,这意味着它无处可待。

我希望这只是一个语法问题,但我很难找到整个脚本循环的原因。我非常欣赏正确方向的任何指示。

1 个答案:

答案 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()函数。