我有一个程序,其中我想并行运行其中一个函数用于多个参数。
该程序采用以下格式:
import statements
def function1():
do something
def function2()
do something
def main():
function1()
我找到了几个如何在线使用multiprocessing
库的示例,例如以下通用模板
import multiprocessing
def worker(num):
print 'Worker:', num
return
if __name__ == '__main__':
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
p.start()
根据我的理解,worker()
是要并行执行的功能。但我不知道在哪里或如何使用
(if __name__ == '__main__':
)阻止代码。
截至目前该块在我的main()
中,当我运行程序时,我没有多次执行worker函数,而是我的main被多次执行了?
那么放置(if __name__ == '__main__':
)块
答案 0 :(得分:2)
将您提供的两个示例混合在一起,它看起来像这样:
import multiprocessing
def worker(num):
print 'Worker:', num
return
def main():
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
p.start()
p.join()
if __name__ == '__main__':
main()
将worker
替换为function1
,即您想要并行化。
关键部分是在main
块中调用if __name__ == '__main__':
函数,但是在这个简单的示例中,您可以轻松地将代码直接放在def main():
if __name__ == '__main__':
下。
如果您永远不会从此文件导入任何内容,则甚至不需要if __name__ == '__main__':
部分;只有当您希望能够将此脚本中的函数导入其他脚本/交互式会话而不运行main()
中的代码时,才需要这样做。请参阅What does if __name__ == "__main__": do?。
所以最简单的用法是:
import multiprocessing
def worker(num):
print 'Worker:', num
return
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
p.start()
p.join()
编辑:多处理池示例
import multiprocessing
def worker(num):
#print 'Worker:', num
return num
pool = multiprocessing.Pool(multiprocessing.cpu_count())
result = pool.imap(worker, range(5))
print list(result)
打印:
[0, 1, 2, 3, 4]
有关更详细的说明,另请参阅Python multiprocessing.Pool: when to use apply, apply_async or map?。