day10 消息队列,多进程和多线程以及协程,异步IO,事件驱动等
2024-09-03 13:20:09
回顾一下线程和进程
线程与进程的区别
守护线程:
队列:
两种方式:
先进先出 #
后入先出 #卖水果,后来的来的是新的
生产者消费者模型:
生产包子,
吃包子
事件 event:
红绿灯模型
什么时候需要多线程:
多进程:
可以起8个进程,每个进程起一个线程,就可以利用多核运算,缺点就是进程之间不能共享数据。
例子:
每一个子进程都有一个父进程启动:
from multiprocessing import Process
import os def info(title):
print(title)
print('module name:', __name__)
print('parent process:', os.getppid())
print('process id:', os.getpid())
print("\n\n") def f(name):
info('\033[31;1mcalled from child process function f\033[0m')
print('hello', name) if __name__ == '__main__':
info('\033[32;1mmain process line\033[0m')
p = Process(target=f, args=('bob',))
p.start()
消息队列:
线程之间通讯:
进程间通信:
实践进程q
from multiprocessing import Process,Queue def f(qq):
qq.put(['yang',12,'hehe']) if __name__ == '__main__':
q = Queue()
p = Process(target=f,args=(q,))
p.start()
print(q.get())
线程q:
管道:
感觉和消息队列差不多
实践:
from multiprocessing import Process, Pipe def f(conn):
conn.send([42, None, 'hello from child'])
conn.send([42, None, 'hello from child2'])
print("from parent:",conn.recv())
conn.close() if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
print(parent_conn.recv()) # prints "[42, None, 'hello']"
print(parent_conn.recv()) # prints "[42, None, 'hello']"
parent_conn.send("张洋可好") # prints "[42, None, 'hello']"
p.join()
进程之间数据的真正共享:
实践,进程间共享数据:
from multiprocessing import Process,Manager
import os def f(dic,list):
dic[os.getpid()] = os.getpid()
list.append(os.getpid())
print(list) if __name__ == '__main__':
with Manager() as manager:
d = manager.dict()
l = manager.list(range(5))
p_list = []
for i in range(10):
p = Process(target=f,args=(d,l))
p.start()
p_list.append(p)
for res in p_list:
res.join()
print(d)
print(l)
multiprocess
Queue \ Pipe 只是实现进程间数据的传递
Manager 实现了进程间数据的共享,即多个进程可以修改同一份数据
这里有个坑:
windows 多进程 必须加
不然会报错
作用:
if __name__ == '__main__':
会检查是否是主动运行,又或者是其他程序调用
如果调用,就不会执行 if __name__ == '__main__': 后面的代码
如果是手动执行,就会正常执行
进程池:
进城池有两种方法:
apply 串行
applu_async 并行
最新文章
- UV动画
- (转载)JavaWeb学习总结(五十)——文件上传和下载
- Javascript之confirm的用法
- android studio 应用小知识总结
- CSS_css sprite原理优缺点及使用
- discuz 系列产品 在ie9下注册成功后不跳转bug处理
- C++实现CString和string的互相转换
- 使用stringstream时的清空操作
- SR4K的API使用(libMesaSR.dll)
- (转)Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
- QT制作一个图片播放器
- Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法
- 06 获取Activity的栈管理器
- m2eclipse Error:ArtifactTransferException: Failure to transfer org.apache.felix:org.apache.felix.res
- Linux什么是挂载?mount的用处在哪?
- Docker中使用createdump调试coreclr
- AngularJS单页面路由配置恩,理解了就很简单啦
- 为什么要使用JS模板引擎
- 关于jsonp知识的理解
- Java开发学习--Java 中基本类型和包装类之间的转换
热门文章
- [翻译] Facebook HHVM 团队封闭开发三周成果展
- 学习笔记:SVG和Canvas
- Counting blessings can actually increase happiness and health by reminding us of the good things in life.
- 原生css3作响应式布局
- Tomcat8
- iOS编程规范(整理)
- CheckPoint_vSEC_Cluster_R77.30
- HDU 1305 Immediate Decodability 可直接解码吗?
- 平时对ES6的一些总结
- 【洛谷4252】[NOI2006] 聪明的导游(提答题)