今日内容:

  1、开启子进程的两种方式

  2、join方法

  3、进程之间内存空间相互隔离

  4、僵尸进程和孤儿进程

  5、守护进程

  6、互斥锁

  7、进程对象其他相关的属性和方法

1、开启子进程的两种方式

方式一:

  1. from multiprocessing import Process
  2. import time
  3.  
  4. # 开启子进程的方式一:借助于Process来开启子进程
  5. def task(name):
  6. print(name,'子进程正在运行')
  7. time.sleep(3)
  8. print(name,'子进程death')
  9.  
  10. if __name__ == '__main__':
  11. p = Process(target=task,args=('yxf',))
  12. p.start()
  13. print('主进程')

方式二:

  1. from multiprocessing import Process
  2. import time
  3. # 开启子进程的方式二:自己新建一个类通过继承Process这个类
  4. class Myprocess(Process):
  5. def __init__(self,name):
  6. super().__init__()
  7. self.name = name
  8.  
  9. def run(self):
  10. print(self.name,'正在运行')
  11. time.sleep(3)
  12. print(self.name,'death')
  13.  
  14. if __name__ == '__main__':
  15. p = Myprocess('yxf')
  16. p.start()
  17. print('主进程')

2、join方法

join方法的作用是:使得子进程结束之后再往下进行主进程

  1. from multiprocessing import Process
  2. import time
  3. def tast(name):
  4. print(name,'子进程正在运行')
  5. time.sleep(3)
  6. print(name,'子进程death')
  7.  
  8. if __name__ == '__main__':
  9. p = Process(target=tast,args=('大张哥',))
  10. p.start()
  11. p.join()
  12. print('主进程')

  

3、进程之间内存空间相互隔离

进程之间内存是达到了一种物理隔离的状态,所以进程之间的内存空间不能直接互相共享,并且如果可以共享也会导致数据混乱。

  1. from multiprocessing import Process
  2.  
  3. n=100
  4. def tast():
  5. global n
  6. n=0
  7. print(n)
  8.  
  9. if __name__ == '__main__':
  10. p = Process(target= tast)
  11. p.start()
  12. p.join()
  13. print(n)
  14. print('主进程')

4、僵尸进程和孤儿进程

僵尸进程对于计算机系统是有害的,因为僵尸进程没有人去管理,若不去清理会导致pid号被占用内存空间也会被占用,达到一定数量就会导致计算机开启不了程序了,所以我们需要手动回收掉这些进程

孤儿进程对于计算机系统是无害的,是因为再liunx系统下会有一个init去管理回收这些孤儿进程。

5、守护进程

守护进程是类似于绑定到主进程的,若主进程运行完毕,守护进程也会直接被关闭。若守护进程先运行完毕,那就守护进程相当于一个正常的子进程。

  1. from multiprocessing import Process
  2. import time
  3.  
  4. def tast(name):
  5. print(name,'老太监还活着')
  6. time.sleep(3)
  7. print(name,'老太监正常死亡')
  8.  
  9. if __name__ == '__main__':
  10. p = Process(target=tast,args=('张'))
  11. p.daemon = True
  12. p.start()
  13. time.sleep(2)
  14. print('主进程')

6、互斥锁

我们之前说子进程是无法在内存中共享自己的内存数据的,但是子进程可以共享计算机硬盘上的数据,因为在硬盘上数据并没有隔离,但是如果一份数据同时被多个子进程操作,那么就会导致数据的混乱,所以这时候就需要用到互斥锁,互斥锁的作用就是,将原本并发的子进程在互斥锁作用到的这段代码中变成串行方式去运行。

  1. #我模拟的是一个抢票系统,我设定了json数据中只剩下了一张票,并产生了10个子进程去抢票
  2. from multiprocessing import Process,Lock
  3. import json
  4. import time,random
  5. def serch(name):
  6. print('客户%s,进入购票系统'%name)
  7. with open(r'E:\code\GoodDog\day34\a.json','rt',encoding='utf-8') as f:
  8. odd = json.load(f)
  9. time.sleep(1)
  10. print('客户%s,剩余票数:%s'%(name,odd['odd']))
  11. def get(name):
  12. with open(r'E:\code\GoodDog\day34\a.json','rt',encoding='utf-8') as f:
  13. odd = json.load(f)
  14. if odd['odd']>0:
  15. time.sleep(random.randint(1,3))
  16. odd['odd']-=1
  17. with open(r'E:\code\GoodDog\day34\a.json', 'wt', encoding='utf-8') as f:
  18. json.dump(odd,f)
  19. print('客户%s,购票成功'%name)
  20. else:
  21. print('客户%s,购票失败'%name)
  22. def tast(name,mutex):
  23. serch(name)
  24. mutex.acquire()
  25. get(name)
  26. mutex.release()
  27.  
  28. if __name__ == '__main__':
  29. mutex = Lock()
  30. for i in range(10):
  31. p = Process(target=tast,args=(i,mutex))
  32. p.start()

7、进程对象其他相关的属性和方法

  1. from multiprocessing import Process,current_process
  2. import time
  3.  
  4. def tast(name):
  5. print('%s%s子进程存活'%(name,current_process().pid))#current_process().pid:用来查看该进程的pid
  6. time.sleep(3)
  7. print('%s%s子进程death'%(name,current_process().pid))
  8.  
  9. if __name__ == '__main__':
  10. p = Process(target=tast,args=('a',))
  11. p.start()
  12. p.terminate()#用来停止正在进行的这个子进程
  13. time.sleep(4)
  14. print(p.is_alive())#用来查看子进程是否还在运行
  15. p.join()
  16. print('主',current_process().pid)

调用OS模块查看PID号的方式:

  1. from multiprocessing import Process
  2. import os
  3. import time
  4.  
  5. def tast(name):
  6. print('%s%s子进程存活'%(name,os.getppid()))#os.getppid():用来查看该子进程的主进程PID
  7. time.sleep(3)
  8. print('%s%s子进程death'%(name,os.getpid()))#,os.getpid():用来查看子进程的PID
  9.  
  10. if __name__ == '__main__':
  11. p = Process(target=tast,args=('a',))
  12. p.start()
  13. # p.terminate()
  14. time.sleep(4)
  15. # print(p.is_alive())
  16. p.join()
  17. print('主',os.getppid())

  

day34的更多相关文章

  1. Spark Streaming揭秘 Day34 解析UI监听模式

    Spark Streaming揭秘 Day34 解析UI监听模式 今天分享下SparkStreaming中的UI部分,和所有的UI系统一样,SparkStreaming中的UI系统使用的是监听器模式. ...

  2. BroadcastReceiver和Intetnt的理解 Day34

    BroadcastReceiver和Intetnt的理解 Day34 mobile4.0 短信监控 问题堆栈 1. 下载开源项目View.网址自己fork一下 2. ContentProvider原理 ...

  3. day34——僵尸进程和孤儿进程、互斥锁、进程之间的通信

    day34 僵尸进程和孤儿进程 基于unix环境(linux,macOS) 主进程需要等待子进程结束之后,主进程才结束 主进程时刻监测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收 ...

  4. day34 并行并发、进程开启、僵尸及孤儿进程

    day34 并行并发.进程开启.僵尸及孤儿进程 1.并行与并发 什么是并行? 并行指的是多个进程同时被执行,是真正意义上的同时 什么是并发? 并发指的是多个程序看上去被同时执行,这是因为cpu在多个程 ...

  5. day34 前端基础之JavaScript

    day34 前端基础之JavaScript ECMAScript 6 尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,当然,也不是唯一被标准化的部分.实际上 ...

  6. 兼容,原来在这里就已经開始--------Day34

    看了两天,算是将w3cschool的javascript部分浏览了一遍.在脑海中大约有了一点概念,也才真切体会到:一入江湖深似海.欲穷此路难上难啊,至少如今看起来是遥遥无期.太多不懂, 太多茫然,只是 ...

  7. day34 基于TCP和UDP的套接字方法 粘包问题 丢包问题

    TCP 基于流的协议 又叫可靠性传输协议 通过三次握手 四次挥手 来保证数据传输完毕 缺点效率低 正因为是基于流的协议 所以会出现粘包问题粘包问题:原因一:是应为数据是先发送给操作系统,在操作系统中有 ...

  8. day34 GIL锁 线程队列 线程池

    一.Gil锁(Global Interpreter Lock) python全局解释器锁,有了这个锁的存在,python解释器在同一时间内只能让一个进程中的一个线程去执行,这样python的多线程就无 ...

  9. day34进程相关

    进程1 什么是进程    进程指的是一个正在进行/运行的程序,进程是用来描述程序执行过程的虚拟概念    进程vs程序    程序:一堆代码    进程:程序的执行的过程    进程的概念起源于操作系 ...

随机推荐

  1. Mysql实现级联操作(级联更新、级联删除)

    一.首先创建两张表stu,sc create table stu( sid int UNSIGNED primary key auto_increment, name ) not null) TYPE ...

  2. js-ES6学习笔记-Class(5)

    1.原生构造函数会忽略apply方法传入的this,也就是说,原生构造函数的this无法绑定,导致拿不到内部属性.比如,Array构造函数有一个内部属性[[DefineOwnProperty]],用来 ...

  3. JS里面的懒加载(lazyload)

    懒加载技术(简称lazyload)并不是新技术, 它是js程序员对网页性能优化的一种方案.lazyload的核心是按需加载 涉及到图片,falsh资源 , iframe, 网页编辑器(类似FCK)等占 ...

  4. CentOS7上搭建LDAP-PDC并且将windows 2008 R2加入LDAP-PDC域

    由于测试原因,要涉及到将windows机器加入到ldap域,所以查看各种文档进行ldap-pdc域的搭建,并成功将windows 2008r2加入到ldap-pdc域中.下面简单记录一下搭建过程 Li ...

  5. Android--PullToRefreshListView的onRefreshComplete()不起作用的问题

    今天用到了网上开源的下拉刷新组件PullToRefreshListView的第三方下拉刷新的ListView 我们发现 有时候我们当使用它的onRefreshComplete()方法是,我们下拉出来的 ...

  6. Android 获取系统语言(兼容7.0)

    转载连接:http://likfe.com/2017/05/10/android-sys-language/ 前言 获取系统当前语言是一个比较常用的功能,在 Android 7.0 系统上旧函数获取到 ...

  7. iOS手机流量抓包rvictl

    移动设备抓包主要方式 一.PC上设置网络共享,生成Wi-Fi热点供移动设备使用,PC上再使用tcpdump.Wireshark等捕获分析: 二.PC上开启http代理工具服务器(如Charles.fi ...

  8. pt-osc全解pt-online-schema-change

    MySQL 大字段的DDL操作:加减字段.索引.修改字段属性等,在5.1之前都是非常耗时耗力的,特别是会对MySQL服务产生影响.在5.1之后随着Plugin Innodb的出现在线加索引的提高了很多 ...

  9. 检索 COM 类工厂中 CLSID 为 {00021A20-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80080005

    创建Excel对象失败: Excel.Application xApp = new Excel.Application(); 错误提示:{"检索 COM 类工厂中 CLSID 为 {0002 ...

  10. Qt: QSqlRecord字段值为null时注意事项

    QSqlRecord在对应字段值为null时,QSqlRecord::value返回的QVariant是有效但为null(相当于使用QVariant(Type type)构造的),所以此时做对应类型的 ...