回顾一下线程和进程

线程与进程的区别

守护线程:

队列:

两种方式:

先进先出  #
后入先出   #卖水果,后来的来的是新的

生产者消费者模型:

生产包子,

吃包子

事件 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   并行

最新文章

  1. UV动画
  2. (转载)JavaWeb学习总结(五十)——文件上传和下载
  3. Javascript之confirm的用法
  4. android studio 应用小知识总结
  5. CSS_css sprite原理优缺点及使用
  6. discuz 系列产品 在ie9下注册成功后不跳转bug处理
  7. C++实现CString和string的互相转换
  8. 使用stringstream时的清空操作
  9. SR4K的API使用(libMesaSR.dll)
  10. (转)Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
  11. QT制作一个图片播放器
  12. Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法
  13. 06 获取Activity的栈管理器
  14. m2eclipse Error:ArtifactTransferException: Failure to transfer org.apache.felix:org.apache.felix.res
  15. Linux什么是挂载?mount的用处在哪?
  16. Docker中使用createdump调试coreclr
  17. AngularJS单页面路由配置恩,理解了就很简单啦
  18. 为什么要使用JS模板引擎
  19. 关于jsonp知识的理解
  20. Java开发学习--Java 中基本类型和包装类之间的转换

热门文章

  1. [翻译] Facebook HHVM 团队封闭开发三周成果展
  2. 学习笔记:SVG和Canvas
  3. Counting blessings can actually increase happiness and health by reminding us of the good things in life.
  4. 原生css3作响应式布局
  5. Tomcat8
  6. iOS编程规范(整理)
  7. CheckPoint_vSEC_Cluster_R77.30
  8. HDU 1305 Immediate Decodability 可直接解码吗?
  9. 平时对ES6的一些总结
  10. 【洛谷4252】[NOI2006] 聪明的导游(提答题)