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.pool
和apply_async
或imap
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的多处理库在进程之间传递套接字的示例