Python,多处理库问题

Posted

技术标签:

【中文标题】Python,多处理库问题【英文标题】:Python, issue with multiprocessing library 【发布时间】:2016-08-28 21:31:21 【问题描述】:

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

程序格式如下:

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() 中,当我运行程序时,我没有多次执行工作函数,而是我的 main 被多次执行?

那么在哪里放置 (if __name__ == '__main__':) 块的合适位置

【问题讨论】:

将并行化逻辑(对multiprocessing 的调用)放入main 函数中。然后,在if __name__ == '__main__' 内调用main 您需要显示您正在运行的实际代码。由于您显示 的代码中没有任何内容调用您的main() 函数,因此我们无法猜测它为什么曾经 被调用。但是,如果您遵循您第二次发布的模板,您的代码将起作用。 【参考方案1】:

将您提供的两个示例混合在一起,它看起来像这样:

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,即您想要并行化的任何一个。

关键部分是在if __name__ == '__main__': 块中调用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?。

【讨论】:

当我运行第一个版本时,它可以工作,但它没有给我预期的输出,工人:0,工人:1,工人:2...相反,每次我运行时顺序都会有所不同它,有时是 (1,2,0,4,3) 或 (0,3,2,1,4) 也是您提供的第二个版本,没有 if name == 'main ':当我尝试时永远运行 顺序不同,因为multiprocessing 将对worker 的每个调用拆分为跨多个内核的单独进程,而不关心进程被调用、完成和返回的顺序。结果以它们完成的顺序返回,而不是它们被调用的顺序。如果您想保留订单,请查看multiprocessing.poolapply_asyncimap docs.python.org/2/library/multiprocessing.html#examples。 对于第二个版本,如果不在功能块中,可能需要.join()。见docs.python.org/2/library/…

以上是关于Python,多处理库问题的主要内容,如果未能解决你的问题,请参考以下文章

如何从控制台使用多处理库(使用 map_async)启动 python 脚本

Python 多处理库错误(AttributeError:__exit__)

在函数内获取变量更新(Telegram bot、Python3、python-telegram-bot 库、多处理)

python 使用Python的多处理库在进程之间传递套接字的示例

Celery 在本地系统上的效率与 python 多处理一样吗?

如何调试静默崩溃?多处理 python