为什么 pool 运行 整个文件多次?

Why does pool run the entire file multiple times?

我正在尝试理解此 Python 2.7.5 示例脚本的输出:

import time
from multiprocessing import Pool

print(time.strftime('%Y-%m-%d %H:%M', time.localtime(time.time())))
props2=[
            '170339',
            '170357',
            '170345',
            '170346',
            '171232',
            '170363',
            ]
def go(x):
     print(x)

if __name__ == '__main__':
    pool = Pool(processes=3)
    pool.map(go, props2)

print(time.strftime('%Y-%m-%d %H:%M', time.localtime(time.time())))  

这会产生输出:

2015-08-06 10:13

2015-08-06 10:13

2015-08-06 10:13

170339

170357

170345

170346

171232

170363

2015-08-06 10:13

2015-08-06 10:13

2015-08-06 10:13

我的问题是:

A) 为什么时间在开头和结尾打印了三次?我原以为它会打印开始时间,然后是结束时间。

B) 真正的问题 - 我如何多次获得 运行 一个命令,但所有其他命令一次?

Multiprocessing 需要在每个子进程中导入您的脚本才能使用 go() 功能。导入脚本时,它会打印日期。如果你只想在主脚本中 运行 ,把它放在 if __name__ == '__main__' 块中。

Python 为每个进程导入 __main__ 模块。在导入时,整个文件被再次执行。在 python 3 上,如果你删除 if __name__ == '__main__' 你将得到一个无限循环,因为文件被递归调用。

真题:

在 python 脚本中,我通常尽量避免在全局范围内执行任何语句或变量,函数定义除外。我将以下内容用作所有 python 脚本的模板。

import sys

def main(argv):
  #main logic here

if __name__ == '__main__':
  main(sys.argv)

当你有一个具有可重用功能的脚本时,即使它有一个 main 方法,如果需要,你也可以将它导入到另一个脚本中。

下面的修改不会多次打印这些行。

import time

from multiprocessing import Pool

def main():
  if __name__ == '__main__':
  print(time.strftime('%Y-%m-%d %H:%M', time.localtime(time.time())))
  props2=[
        '170339',
        '170357',
        '170345',
        '170346',
        '171232',
        '170363',
        ]

  pool = Pool(processes=3)
  pool.map(go, props2)

  print(time.strftime('%Y-%m-%d %H:%M', time.localtime(time.time())))

def go(x):
  print(x)

main()

您原来的 post 缩进错误:

print(time.strftime('%Y-%m-%d %H:%M', time.localtime(time.time())))  

每个进程的所有 "global" 个语句都是 运行。