主进程和子进程_Python - 进程-线程-协程
并发:伪并行,遇到IO,帮我们提高代码执行效率并行:真正的同时运行,多核cpu
进程:
父进程和子进程
os.getpid()当前进程的id,getppid()父进程的id
创建进程的两种方式:
方式1: from multiprocessing import Process def f(n) print(n) if __name__ == '__main__': p = Process(target=f,args=(1,)) p.daemon = True p.start() p.join() #主进程等待子进程 方式2: from multiprocessing import Process class MyProcess(Process): def __init__(self,n): self.n = n super().__init__() #这是需要执行的代码逻辑 def run(self): print(self.n) self.f2() print('xxxxxx') def f2(self): xxxx if __name__ == '__main__': p = MyProcess(20) p.start() print('主进程结束')
进程三状态:
就绪 运行 阻塞
进程间通信(IPC)
队列
from multiprocessing import Process,Queueq = Queue(3) #3个长度的队列q.put(1) #如果满了,阻塞程序q.get() #如果没了,阻塞程序q.qsize() #统计一下当前队列里面有多少个数据了q.empty() #是否为空,不可信q.full() #是否满了,不可信q.put_nowait('a') #如果满了就报错,不等待 q.get_nowait() #如果没了就报错,不等待
进程通过队列通信:
from multiprocessing import Process,Queuedef f1(q): ret = q.get() print('子进程的ret>>',ret)if __name__ == '__main__': q = Queue(3) q.put('你好') p = Process(target=f1,args=(q,)) p.start()
线程
创建线程的两种方式
方式1from threading import Threaddef f1(n): passif __name__ == '__main__': t = Thread(target=f,args=(1,)) t.daemon = True #守护线程 t.start() t.join()方式2:class MyThread(Thread): def __init(self,n): super().__init__() self.n = n def run(self): print(self.n) passif __name__ == '__main__': t = MyThread('aa') t.start()
守护线程和守护进程的区别
守护进程:随着主进程的代码执行结束,而结束守护线程:随着所有非守护线程的执行结束而结束
锁
互斥锁 Lock
作用:多线程或者多进程在操作共享数据的时候,会出现数据混乱的问题,加锁处理,牺牲了效率,保证了安全.from threading import Thread,Lockfrom multiprocessing import Process,Lockdef f1(loc): loc.acquire() xxxx loc.release() with loc: xxxxxloc = Lock()t = Thread(target=f1,args=(loc,))t.start()
递归锁 RLock
死锁现象,内部维护了一个计数器from threading import Thread,RLockfrom multiprocessing import Process,RLockloc = RLock()t = Thread(target=f1,args=(loc,))t.start()
线程队列:
import queue#先进先出的q = queue.Queue(4)...#先进后出的q = queue.LifoQueue(4)#优先级的q = queue.PriorityQueue(4)q.put((1,'xx')) #数字越小,优先级越高,越早被取出q.get() -- (1,'xx')如果优先级数字相同,后面的值类型不能不一样,而且两个字典也不能比
线程池和进程池
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor#线程池ThreadPoolExecutor#进程池ProcessPoolExecutordef f1(n,m) pass return n*n def call_back(m): m.result()--n*n print(m) #结果集对象 print(m.result())pool = ThreadPoolExecutor(max_workers=5)pool = ProcessPoolExecutor(max_workers=5)ret = pool.submit(f1,1,2)ret.result() #类似join,拿不到结果就阻塞程序pool.shutdown() #关闭池子pool.submit(f1,1,2).add_done_callback(call_back)
协程
gevent --- 基于greenlet模块
def f1(n):
pass
def f2(n):
pass
g1 = gevent.spawn(f1,1)
g2 = gevent.spawn(f2,1)
g1.join() #一个一个的join
gevent.joinall([g1,g2])
print('主任务')
主进程和子进程_Python - 进程-线程-协程相关推荐
- linux的进程/线程/协程系列5:协程的发展复兴与实现现状
协程的发展复兴与实现现状 前言 本篇摘要: 1. 协同制的发展史 1.1 协同工作制的提出 1.2 自顶向下,无需协同 1.3 协同式思想的应用 2. 协程的复兴 2.1 高并发带来的问题 2.2 制 ...
- 4.19 python 网络编程和操作系统部分(TCP/UDP/操作系统概念/进程/线程/协程) 学习笔记
文章目录 1 网络编程概念 1)基本概念 2)应用-最简单的网络通信 2 TCP协议和UDP协议进阶(网络编程) 1)TCP协议和UDP协议基于socket模块实现 2)粘包现象 3)文件上传和下载代 ...
- Linux的进程/线程/协程系列4:进程知识深入总结:上篇
Linux的进程/线程/协程系列4:进程/线程相关知识总结 前言 本篇摘要: 1. 进程基础知识 1.1 串行/并行与并发 1.2 临界资源与共享资源 1.3 同步/异步与互斥 1.4 进程控制原语 ...
- linux的进程/线程/协程系列1:进程到协程的演化
linux的进程/线程/协程系列1:进程到协程的演化 前言 摘要: 1. 一些历史:批处理时代 2. 现代操作系统启动过程 3. 进程(process)的出现 4. 线程(thread)与线程池 5. ...
- 简要说明__python3中的进程/线程/协程
多任务可以充分利用系统资源,极大提升程序运行效率,多任务的实现往往与 多线程,多进程,多协程有关 稳定性: 进程 > 线程 > 协程 系统资源占用量:进程 > 线程 > 协程 ...
- linux的进程/线程/协程系列3:查看linux内核源码——vim+ctags/find+grep
linux的进程/线程/协程系列3:查看linux内核源码--vim+ctags/find+grep 前言 摘要: 1. 下载linux内核源码 2. 打标签方法:vim+ctags 2.1 安装vi ...
- Python之进程+线程+协程(异步、selectors模块、阻塞、非阻塞IO)
文章目录 一.IO多路复用 二.selectors模块 本篇文字是关于IO多路复用的更深入一步的总结,上一篇 Python之进程+线程+协程(事件驱动模型.IO多路复用.select与epoll)对I ...
- 进程 线程 协程 各自的概念以及三者的对比分析
文章目录 1 进程 2 线程 3 进程和线程的区别和联系 3.1 区别 3.2 联系 4 举例说明进程和线程的区别 5 进程/线程之间的亲缘性 6 协程 线程(执行一个函数)和协程的区别和联系 协程和 ...
- 线程/协程/异步的编程模型(CPU利用率为核心)
最近看了一个b站博主的视频https://www.bilibili.com/video/av64066246/讲到了线程/协程/异步的编程模型,这里做下记录 1.线程 上篇文章有聊到进程和线程的关系, ...
- python协程实现一万并发_python中的协程并发
python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程.无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态 ...
最新文章
- OpenCV拼接细节stitching detailed的实例(附完整代码)
- CRMEB系统开发文档
- MPEG创始人、主席:MEPG商业模式已经破裂
- 征信逾期花钱就能修复?小心跳进骗子的坑里面去
- Unity 获得某个物体的主贴图
- HTML5 语义元素
- 淘宝客商城带分销APP源码(原生双端IOS+安卓+后台+数据 库+开发文档),用于学习或二开使用,开发语言:安卓java,苹果oc,后台php。
- C中字符串常量字符数组字符常量
- 时间序列分析-MA模型
- 2021-03-30 libnice 应用 多线程
- ntfs磁盘格式是什么?NTFS如何读写Mac硬盘?
- 转!!以太网方案设计
- PV-1033/PV-1233/EVP-M33插装式压力补偿流量阀比例放大器
- 弘辽科技:如何书写淘宝直通车创意标题才能带来更多的流量?
- UVA11021 Tribles 概率
- 20135203齐岳 信息安全系统设计基础第五周学习总结
- ERROR: No Jack server running
- JAVA 映射HashMap和HashTable的区别和实用
- 常见的注册表操作及其含义
- 电脑双屏显示变单屏后部分程序无法在当前屏幕显示的问题