使用python创建进程

  1. from multiprocessing import Process # 导入进程模块
  2. import time
  3. # 定义一个函数,测试创建进程使用
  4. def task(name):
  5. print(name, '我是一个进程')
  6. time.sleep(3)
  7. print(name, '我现在运行完成啦')
  8. # 执行进程,在windows中必须使用这种方法调用,否则会出现循环导入的情况,最终导致报错。
  9. if __name__ == '__main__':
  10. process1 = Process(target=task, args=('子进程1号说>>>:',)) # 1
  11. process1.start() # 2
  12. print('我是主进程') # 3
  13. '''
  14. 返回结果:
  15. 我是主进程
  16. 子进程1号说>>>: 我是一个进程
  17. 子进程1号说>>>: 我现在运行完成啦
  18. 整个main里面的执行过程说明:
  19. 1.创建一个进程对象
  20. 2.启动进程,告诉操作系统创建一个新的进程 并在该进程中执行task函数(异步)
  21. 3.打印“我是主进程”字符串(同步)
  22. 4.执行进程内部的函数体代码
  23. '''

进程间的数据隔离

  1. # 同一台计算机之间的多个进程数据是严格意义上的物理隔离的(在默认情况下)
  2. # 测试代码如下:
  3. from multiprocessing import Process
  4. import time
  5. money = 1000
  6. def task():
  7. global money
  8. money = 666
  9. print('我是子进程task,我在查看变量money>>>:', money)
  10. if __name__ == '__main__':
  11. print('函数执行前>>>:', money)
  12. task()
  13. print('函数执行后>>>:', money)
  14. # 正常执行完以后,money变量被函数中的变量修改,最后变为666
  15. '''
  16. 函数执行前>>>: 1000
  17. 我是子进程task,我在查看变量money>>>: 666
  18. 函数执行后>>>: 666
  19. '''
  20. # 如果我们把上面的执行过程换成进程执行:
  21. if __name__ == '__main__':
  22. process1 = Process(target=task, )
  23. process1.start()
  24. time.sleep(3)
  25. print(money) # 看输出结果可以看到,这里并未被函数中的变量修改
  26. '''
  27. 此时的函数返回值:
  28. 我是子进程task,我在查看变量money>>>: 666
  29. 1000
  30. 这里就说明了什么是进程间的数据隔离
  31. '''

进程join方法

  1. from multiprocessing import Process
  2. import time
  3. def task(name, n=3):
  4. print('%s is running' % name)
  5. time.sleep(n)
  6. print('%s is over' % name)
  7. if __name__ == '__main__':
  8. process1 = Process(target=task, args=('子进程1号>>>:', 1))
  9. process2 = Process(target=task, args=('子进程2号>>>:', 2))
  10. process3 = Process(target=task, args=('子进程3号>>>:', 3))
  11. start_time = time.time()
  12. process1.start()
  13. process2.start()
  14. process3.start()
  15. process1.join()
  16. process2.join()
  17. process3.join()
  18. print('我是主进程')
  19. print('我的执行时间>>>:', time.time() - start_time)
  20. '''
  21. 返回值:
  22. 子进程1号>>>: is running # 进程1号占用时间1秒
  23. 子进程2号>>>: is running # 进程2号占用时间2秒
  24. 子进程3号>>>: is running # 进程3号占用时间3秒
  25. 子进程1号>>>: is over
  26. 子进程2号>>>: is over
  27. 子进程3号>>>: is over
  28. 我是主进程
  29. 我的执行时间>>>: 3.185295581817627 # 三个进程执行时间为3秒出头
  30. 结论:
  31. 1. 三个子进程执行完成以后,主进程才执行。
  32. 2. 三个进程并非是执行完一个再执行下一个,都是先创建好并执行函数体代码,但返回值的时候,是一个一个返回。
  33. '''

进程间通信的方法

  1. '''
  2. 根据之前的实验得知,进程间严格意义上说是不能通信的(默认),但是也有方法可以通信(或者说传递数据),那就是使用消息队列,进程将产生的数据放到消息队列中,其他进程再去消息队列中取。
  3. 下面初步介绍一下Queue的简单用法:
  4. '''
  5. from multiprocessing import Queue
  6. # 消息队列模块(复习:队列是先进先出,堆栈是先进后出)
  7. # 1. 指定存放数据的个数
  8. q = Queue(3)
  9. # 2. 向消息队列中存放数据
  10. q.put('我是第一个')
  11. # 3. 可以判断队列是否已满
  12. print(q.full()) # 返回False
  13. # 4. 继续向队列中存放数据
  14. q.put('我是第二个')
  15. q.put('我是第三个')
  16. print(q.full()) # 返回True
  17. # 5. 因为在创建对象的时候指定的队列只能存放3个数据,所以再存放第四个的时候会出现等待现象。
  18. # 6. 等待现象什么时候会结束?当有一个数据被取走的时候就对结束等待,将后面的数放入队列中。
  19. # 7. 判断队列是否为空
  20. print(q.empty()) # 返回False

查看进程的多种方法

  1. from multiprocessing import Process, current_process
  2. import os
  3. def task():
  4. print(current_process()) # <Process name='Process-1' parent=39140 started> (可以看到它的父进程号是39140)
  5. print(current_process().pid) # 34064 # 当前进程的进程号(这个是子进程)
  6. # 1.查看进程
  7. if __name__ == '__main__':
  8. p1 = Process(target=task)
  9. p1.start()
  10. print(current_process()) # <_MainProcess name='MainProcess' parent=None started>
  11. print(current_process().pid) # 39140 当前进程的进程号(这个是主进程)
  12. print(os.getpid()) # 39140 查看此进程的进程号
  13. print(os.getppid()) # 35544 查看父进程的进程号 (getppid 第一个p就是parent)
  14. # # 2. 终止进程
  15. #
  16. # if __name__ == '__main__':
  17. # p1 = Process(target=task)
  18. # p1.start()
  19. # p1.terminate() # 终止进程
  20. #
  21. # # 3. 判断进程是否存活
  22. # if __name__ == '__main__':
  23. # p1 = Process(target=task)
  24. # p1.start()
  25. # p1.terminate() # 终止进程
  26. # p1.is_alive()
  27. #
  28. # # 4. 创建守护进程
  29. # if __name__ == '__main__':
  30. # p1 = Process(target=task)
  31. # p1.daemon = True # 此时p1的父进程结束,p1不管是否运行完都会结束
  32. # p1.start()

Python之进程管理的更多相关文章

  1. Python—守护进程管理工具(Supervisor)

    一.前言简介 1.Supervisor 是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX 操作系统上面的进程.可以很方便的用来启动.重启.关闭进程(不仅仅是 ...

  2. Python 进程管理工具 Supervisor 使用教程

    Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上.Supervisor 官方版目前只能运行在 Python 2 ...

  3. 进程管理工具supervisor

    1. 简介 supervisor有两个组件:supervisord和supervisorctl,组成了client/server结构. supervisord负责读入配置文件,然后supervisor ...

  4. 【Python】使用Supervisor来管理Python的进程

    来源 : http://blog.csdn.net/xiaoguaihai/article/details/44750073     1.问题描述 需要一个python的服务程序在后台一直运行,不能让 ...

  5. Python::OS 模块 -- 进程管理

    os模块的简介参看 Python::OS 模块 -- 简介 os模块的文件相关操作参看 Python::OS 模块 -- 文件和目录操作 os模块的进程参数 Python::OS 模块 -- 进程参数 ...

  6. supervisor python开发的进程管理工具

    Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的用来启动.重启.关闭进程(不仅仅是 Python 进程).除了对单个进程的 ...

  7. python 标准类库-并行执行之subprocess-子进程管理

    标准类库-并行执行之subprocess-子进程管理 by:授客QQ:1033553122 1.使用subprocess模块 以下函数是调用子进程的推荐方法,所有使用场景它们都能处理.也可用Popen ...

  8. supervisor - Python进程管理工具(转)

    add by zhj: 下面是在ubuntu上的一些使用经验 1. 简介 supervisor有两个组件:supervisord和supervisorctl,组成了client/server结构. s ...

  9. python之supervisor进程管理工具

    supervisor是python写的一个管理进程运行的工具,可以很方便的监听.启动.停止.重启一个或多个进程:有了supervisor后,就不用字节写启动和监听的shell脚本了,非常方便. sup ...

  10. supervisor - Python进程管理工具

    经常会碰到要写一些守护进程,简单做法放入后台: shell> nohup python xxx.py & 偶尔这么做还可以接受,如果一堆这样的呢? 当然还有一个问题,就是各种服务,对应的 ...

随机推荐

  1. Vant+小程序+购物车实例

    图片实例,看是否是您所需要的喔.... 扫码小程序可看实例操作,有啥问题也可扫码加群,很希望可以帮助到你喔!           HTML部分: <view class="cart&q ...

  2. UE C++教程之接口 UINTERFACE

    我是谁不重要,重要的是,我能做什么. 近期笔者在进行UE的开发时,实现多武器的换弹与开火需要用到接口.而笔者以前是做Unity开发的,遂没有使用过UE C++的UINTERFACE,而这个接口在使用过 ...

  3. 第12组 Beta冲刺 总结

    1.基本情况: 组长博客链接:https://www.cnblogs.com/yaningscnblogs/p/14050343.html 答辩总结:答辩中,对于老师提出的意见,我们认为能够帮助我们更 ...

  4. WV电影网站的设计与实现-可行性研究分析报告

    引言 WV(Wonderful View)电影网站--奇景电影网. 1.1编写目的 1.2背景 在信息发展的时代,地球人口越来越多,人们相比去拥挤的电影院,更喜欢待在舒适的家中,通过互联网访问本站,实 ...

  5. JSP第五周作业

    1.教材p39实验3(听英语) <%@ page language="java" import="java.util.*" pageEncoding=&q ...

  6. Java中简单易懂的HashMap面试题(面试必备)

    这篇文章仅限小编个人的理解,小编不是Java方向的,只是对Java有很高的学习兴趣 如果有什么不对的地方还望大佬指点 HashMap的底层是数组+链表,(很多人应该都知道了) JDK1.7的是数组+链 ...

  7. HBase启动HMaster闪退

    1.问题描述 (1)HBase启动 [Hadoop@master conf]$ start-hbase.sh SLF4J: Class path contains multiple SLF4J bin ...

  8. scrapy.Request callback不执行

    1.在scrapy.Request方法里边加上参数dont_filter=True(去重) 2.增加是不是allowed_domains范围内的url 3.yield Request 改为yield ...

  9. gradle设置

    本地目录: gradle-wrapper.properties distributionUrl=file\:///D:/\.gradle/gradle-7.3-all.zip distribution ...

  10. Vue插件开发,全局插件和按需加入插件

    年前手下事情少,找了一个下午研究了一下Vue插件开发,首先要感谢B站的前端小野森森-2,借鉴了他的视频,自己也写了一下.把过程记录下来. 首先用vite建一个空项目. 然后新建modules文件夹,和 ...