当前位置: 首页 > news >正文

Python 多进程编程(一)Pool Manager in multiprocessing

  • 子进程的复制范围:pool.apply_async产生的新进程会复制主进程里不在if name == 'main’里定义的代码和数据,然后运行传入的func函数。
  • 两个进程同步的变量:因为新进程里的代码和数据是复制出来的,因此在两个进程中对两者进行更新并不会相互更新。Manager就是为了保证同一个变量在一个进程中跟新了,另一个进程中也跟着响应的更新了。
  • 为了保证同步更新的,有时候需要引入Lock来保证操作的原子性。

使用multiprocessing的时候需要注意的几个问题是

  • 由于上面说的子进程的复制范围:传入pool.apply_async 的函数func,必须是在if name == 'main’外定义的 函数 或者 类的成员函数
  • 同样,如果代码写在if name == 'main’外,则会被子进程运行,因此如果在if name == 'main’外调用pool.apply_async,则会无限递归的产生子进程而报错。
  • 最后,很多时候多进程代码报错了,但报错信息却没有打印到控制台,此时需要给代码加上try except,把可能的报错信息写入文件。

示例代码如下:

import multiprocessing
import time


def f(i, norm_list, manager_list, n):
    time.sleep(3)
    norm_list.append(n)
    manager_list.append(n)

    print(f"{i}-th process, normal_list", norm_list)
    print(f"{i}-th process, manager_list", manager_list)


if __name__ == '__main__':
    m = multiprocessing.Manager()
    p = multiprocessing.Pool(3)
    a_list = list(range(4))
    m_dict = m.dict()
    m_list = m.list(a_list)
    p_list = []
    for i in range(3):
        # the args passed to new process is simple copy if not variable of manager
        p.apply_async(f, args=(i, a_list, m_list, i))
    time.sleep(2)  # make sure sub process have created and run. after sub process run, modify a_list and m_list
    a_list.append("a")
    m_list.append("a")
    p.close()
    p.join()
    print(a_list)
    print(m_list)

输出

0-th process, normal_list [0, 1, 2, 3, 0]
0-th process, manager_list [0, 1, 2, 3, 'a', 0, 1]
1-th process, normal_list [0, 1, 2, 3, 1]
1-th process, manager_list [0, 1, 2, 3, 'a', 0, 1]
2-th process, normal_list [0, 1, 2, 3, 2]
2-th process, manager_list [0, 1, 2, 3, 'a', 0, 1, 2]
[0, 1, 2, 3, 'a']
[0, 1, 2, 3, 'a', 0, 1, 2]

相关文章:

  • 从构成看自来水厂自动化控制系统的创新与发展
  • 矿产资源管理系统:开启智慧矿业新篇章
  • vue-router学习4:嵌套路由
  • 产品经理必会12个产品模型
  • 怎么通过Javascript脚本实现远程控制一路开关
  • 数值分析复习:Richardson外推和Romberg算法
  • windows xrdp 到 ubuntu 的一些问题记录
  • Unity零基础到进阶 | Unity中的 RectTransformUtility 方法整理汇总
  • Python 光速入门课程
  • 【Go 快速入门】协程 | 通道 | select 多路复用 | sync 包
  • Java应用通过jmx_exporter对外暴露jvm指标
  • 冯诺依曼体系结构 计算机组成的金字塔
  • 灰度变换 - 灰度切割(灰度级分层)+threshold函数
  • MyBatis 框架的思想及其第一次使用
  • 【Unity Shader】Unity中如何创建Cubemap?
  • 面试百问:项目上线后才发现bug怎么办?
  • C语言《文件版本通讯录》
  • 【无人机】基于EKF、UKF、PF、改进PF滤波算法的无人机航迹预测(Matlab代码实现)
  • 一篇文章让你搞懂Java中的静态代理和动态代理
  • ROS1云课-导航实践测评
  • React中路由的参数传递 - 路由的配置文件
  • (附源码)计算机毕业设计SSM基于web的健康饮食信息管理系统
  • 算法的意义、如何学习算法和算法的复杂度
  • 由浅到深带你详谈Java实现数组扩容的三种方式【建议收藏】
  • 【ML on Kubernetes】第 1 章:机器学习的挑战
  • 技巧分享-电脑版微信如何登录多个账号
  • 精品微信小程序springboot居家养老服务+后台管理前后分离
  • GBase 8c 系统表之DB4AI.SNAPSHOT
  • 高频故障-文件扩展名消失(windows)
  • 冲突域与广播域(详解 + 区别)
  • 国庆征文获奖名单公布
  • java毕业设计大学生创新创业项目管理Mybatis+系统+数据库+调试部署