最近遇到了一个非常麻烦的问题: 复杂的讲, 由于对grpc的了解仅是皮毛, 导致grpc的服务端收到数据后, 没有办法直接使用这些数据, 因为项目中运行grpc服务端被本人封到了一个类一个子进程中, 如下图所示, 本来希望定义一个全局变量global, 然后通过grpc服务端得到数据, 在从主函数中(父进程)中使用这个全局变量的数据, 但是无论进行怎样的尝试都无法实现, 调试了一天, 总觉得是我的语法或者代码逻辑有问题, 直到我查看了一个博客, 写明了一句话 创建进程的时候, 会把资源和全局变量统统拷贝一波, 不会跟父进程共享变量 我傻了呀我, 根据这个线索, 我继续捋顺了一下, 终于查到了需要怎么解决, 那就是下文提到的 from multiprocessing import Manager

简答来讲:

  1. 创建进程, 不管全局还是局部变量, 子进程都统统深拷贝了一份
  2. 想要进程间共享参数, 可以使用 from multiprocessing import Process, Manager
  3. 下面给出实验以及使用

献上我之前写的python的进程和线程

实验1 普通的全局变量在进程间不可用

import numpy as np
import random
import time # 设置系统延时,from multiprocessing import Process, Manager # 多进程执行tvm的server# mdata = Manager().dict() # 创建一个全局dict, 这个全局的dict就可以在进程间通信tvm_data = {}
tvm_data["action"] = 0# tvm_data是一个字典 state, reward, action, maxLen,
def subprocess1():global tvm_datawhile True:for _ in range(1000):print("fun action = ",tvm_data["action"])tvm_data["action"] = _time.sleep(1)def main():global tvm_data            p1 = Process(target=subprocess1, args=()) p1.start()while True:tvm_data["action"] = 0print("main action = ",tvm_data["action"])time.sleep(2)
main()
'''
main action =  0
fun action =  0
fun action =  0
main action =  0
fun action =  1
fun action =  2
main action =  0
fun action =  3
fun action =  4
main action =  0
fun action =  5
fun action =  6
main action =  0
fun action =  7
'''

实验2 使用Manger创建的字典, 在子进程中调用, 有效

import numpy as np
import random
import time # 设置系统延时,from multiprocessing import Process, Manager # 多进程执行tvm的servermdata = Manager().dict() # 创建一个全局dict, 这个全局的dict就可以在进程间通信
mdata["action"] = 0tvm_data = {}
tvm_data["action"] = 0# tvm_data是一个字典 state, reward, action, maxLen,
def subprocess1():global tvm_datawhile True:for _ in range(1000):print("fun action = ",tvm_data["action"])tvm_data["action"] = _time.sleep(1)def subprocess2():while True:for _ in range(1000):print("fun action = ",mdata["action"])mdata["action"] += 1time.sleep(0.5) # 在这2s内增加4def main():global tvm_data            p1 = Process(target=subprocess2, args=()) p1.start()while True:print("main action = ",mdata["action"])mdata["action"] = 0time.sleep(2)
main()
'''
main action =  0
fun action =  0
fun action =  1
fun action =  2
fun action =  3
main action =  4
fun action =  0
fun action =  1
fun action =  2
fun action =  3
main action =  4
fun action =  0
fun action =  1
fun action =  2
fun action =  3
main action =  4
fun action =  0
fun action =  1
fun action =  2
fun action =  3
main action =  4
fun action =  0
fun action =  1
'''

总结

Manager支持的类型有

list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array

但当使用Manager处理list、dict等可变数据类型时,需要注意一个陷阱,即Manager对象无法监测到它引用的可变对象值的修改,需要通过触发__setitem__方法来让它获得通知。

而触发__setitem__方法比较直接的办法就是增加一个中间变量,如同在C语言中交换两个变量的值一样:

int a=1, b=2;
int tmp=a;
a=b;
b=tmp;

所以如果想要进程间使用全局变量, 只需要利用manager定义变量即可

如果这篇文章对你有所收获, 请点赞关注, 感谢支持

python 子进程和父进程参数传递相关推荐

  1. python子进程修改父进程内变量_如何将父变量传递给python中的子进程?

    这里的简单答案是:不要使用subprocess.Popen,使用 multiprocessing.Process.或者,更好的是,multiprocessing.Pool或 concurrent.fu ...

  2. linux的子进程和父进程,[Linux进程]在父进程和子进程中分别对文件进行操作

    [Linux进程]在父进程和子进程中分别对文件进行操作 发布时间:2020-04-10 19:36:49 来源:51CTO 阅读:917 作者:银河星君 /*子进程和父进程同时对一个文件进行写操作导致 ...

  3. linux子进程崩溃父进程如何得知并重启子进程,子进程崩溃父进程如何得知并重启子进程...

    子进程崩溃父进程如何得知并重启子进程 发布时间:2010-11-30 16:00:14来源:红联作者:skywing 大家好,我有一个程序,主进程中fork出两个进程,子进程循环执行任务, 我想做一个 ...

  4. python3 子进程和父进程

    1 from multiprocessing import Process   2 import time,os   3 def fun(name):   4     time.sleep(2)   ...

  5. 子进程和父进程资源共享关系

    子进程会继承父进程什么资源 1.实际UID和GID,以及有效的GID和UID 2.所有环境变量 3.进程组ID和会话ID 4.当前工作路径.除非用chdir()修改 5.打开的文件 6.信号响应函数 ...

  6. php修改父进程变量,shell子进程修改父进程的环境变量值

    shell子进程修改父进程的环境变量值 脚本中的环境变量通过 export 导出,脚本中调用其他脚本使用这个变量 这里有两个脚本程序 hello 和 hello1 hello 脚本代码 #!/bin/ ...

  7. OpenProcess | Process32First | GetExitCodeProcess - WINDOWS API 第二弹 非通信方式的子进程获取父进程信息

    OpenProcess | Process32First | GetExitCodeProcess - WINDOWS API 第二弹 进程相关 目录 一.得到父进程ID(Process32First ...

  8. fork之子进程随父进程死亡prctl

    利用prctl的PR_SET_PDEATHSIG属性设置父进程死亡时,发送给子进程的信号. int pid; pid = fork() if (pid == 0) {//子进程 //设置父进程死亡时自 ...

  9. 子进程和父进程的结论_Python的多进程不是随便用滴!

    python在处理任务时是带有多线程和多进程的,Python不管是多线程还是多进程都不咋好用,不然自导的django也不会初始化时的并发效率不高.今天我们主要来看下Python的多进程. 首先大家先要 ...

最新文章

  1. iterator的使用和封个问题
  2. 捷微jeewx , 免费开源(java)微信公众账号管家系统发布
  3. 钢琴快案例及手风琴案例
  4. Duilib教程-自动布局3-分隔条
  5. linux 访问windows共享
  6. XCode 6 制作framework
  7. 【python数字信号处理】——Z变换
  8. java中和char功能相反的是_JAVA基础语法
  9. DataView的ToTable方法,类似数据库Distinct。
  10. 线程同步--关键代码段(三)
  11. JavaScript中this指针的绑定规则
  12. iOS开发-获取rootViewController的正确方式
  13. 酷狗歌曲缓存kgtemp转mp3工具
  14. 在iphone机型上,input实时中文搜索时,拼音会不断触发onchange的解决方案
  15. 高仿360云盘android端的ui实现,(原创)高仿360云盘android端的UI实现 – 孤~影
  16. PS图层混合模式实例详解
  17. 在线培训考核系统源码
  18. 简述计算机用二进制的原因,简述计算机采用二进制的原因
  19. 赛联区块链教育:对区块链技术做个普及
  20. WMI Provider Host(wmiprvse.exe)占用CPU高的解决方案

热门文章

  1. zabbix配置与告警
  2. Oracle修改instance name
  3. 分享脚本-python3导出某个月份所有同事的文章到Excel列表
  4. set学习之创建,初始化,赋值操作operator=, empty,size
  5. Symbio 与 Rightware 合作交付下一代汽车用户界面
  6. 低阶有限群的伽罗瓦表示
  7. easyui分页的使用方法
  8. php增加logo,PHP图片等比缩放和增加Logo水印代码详解和注释
  9. Java实现图片复制
  10. 【超干】用户画像产品化涵盖的功能模块以及应用场景