python启动多个进程_Python多处理:只有一个进程正在运行

本文探讨了Python启动多个进程时遇到的性能问题,主要原因是大型对象通过管道在父进程和子进程之间传递时进行了序列化和反序列化。通过使用初始化程序和`initargs`参数,可以显著提高性能,避免重复序列化大对象。文中提供了一个修改后的代码示例,以展示如何正确地传递参数以实现子进程的并行运行。
摘要由CSDN通过智能技术生成

由于注释表明您希望使用初始化程序和initargs参数传递featureVector.在Unix类型的系统上,这将导致大量的性能提升(即使selLabel中只有1个项目),因为该值将使用os.fork基本上免费传递给子进程.否则,每次调用foo时,featureVector都将被父进程pickle,通过管道传递并由子进程进行unpickled.这将花费很长时间,并且基本上将序列化所有子进程,因为它们将等待父进程腌制并逐个发送每个调用的featureVector副本.

由于对于我上面谈论的内容存在一些困惑,所以这里有一个更长的解释,说明代码中发生的内容与当前编写的内容有关:

创建Pool对象时,将立即创建30个工作进程,主进程的所有子进程都创建了Pool对象.为了与每个子进程进行通信,创建了一个管道.此管道允许父进程和子进程之间的双向通信.父级使用管道来指示子进程执行的操作,子级使用管道通知父级任何操作的结果.

当您第一次调用pool.apply_async时,父进程通过管道发送命令,指示子进程使用提供的参数执行foo函数.由于其中一个论点是巨大的,300MB,这最终需要很长时间.父进程必须pickle对象.这会将对象(及其引用的所有内容)转换为可通过管道发送的字节流.

由于管道只能容纳大约64k(Linux默认值),并且您发送的内容远不止这些,因此可以有效地同步父进程和其中一个子进程.父进程只能以子进程可以接收和取消它们的速度发送参数,并且子进程只能像父进程一样快地接收参数并发送它们.虽然这是在进行所有其他子进程必须等待.父进程一次只能向一个子进程发送命令.

一旦父进程完成了第一次调用foo的所有参数的发送,它就可以继续发送命令再次调用foo.在此之后不久,一旦子进程收到所有参数,孩子就会调用foo. (这就是为什么在创建任何目录之前需要很长时间,甚至在调用foo之前需要很长时间.)在foo返回之后,子进程将等待父进程发送另一个命令.如果foo本身需要足够短的时间来执行,那么接收第一个命令来调用foo的同一子进程也可能会收到第二个调用foo的命令.

除非foo本身需要很长时间才

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值