Python,多处理库的问题

时间:2016-05-03 17:42:50

标签: python multithreading function multiprocessing main

我有一个程序,其中我想并行运行其中一个函数用于多个参数。

该程序采用以下格式:

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__':)块

的适当位置在哪里

1 个答案:

答案 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?