原创博客地址:python进阶07并发之三其他问题

何时使用多进程(线程)

使用多进程or线程,对于python,考虑到GIL锁,基本上默认使用多进程就对了。
除此之外,线程共享全局变量,进程全局变量则是隔离的,实际进程大多数情况需要通信的,所以也需要考虑共享数据读写问题处理。 决定因素稳定性和数据共享要求上(操作系统差异性,win偏好线程,linux偏好进程)
性能上虽然线程较好,但实际除了大型互联网公司和部分专业性质软件,大多数中小型公司的并发量,并不会带来很大影响,况且目前服务器领域,基本上LInux和Unix占比较高,线程相比进程在性能上优势并不十分突出。所以这方面考量不会太大的。

以下几种情况可考虑多进程(线程)

1
2
3
循环(互相独立,无内部依赖)
耗时操作,批量下载IO等操作,典型的是网络爬虫
分叉型计算,典型的是分治算法,或mapreduce的map阶段

python多线程既然有GIL锁为何还需要加锁

Python已经有一个GIL来保证同一时间只能有一个线程来执行了,为什么这里还需要lock? 注意啦,这里的lock是用户级的lock,跟那个GIL没关系 ,具体我们通过下图来看一下

简单来说就是,“GIL同一时间只有一个线程执行”是微观层面锁,但我们需要加锁的是宏观层面锁
比如 锁(process_a1,process_a2,process_a3),和 锁(process_b1,process_b2,process_b3),如果去掉锁,仅仅依赖GIL的机制,则可能出现:process_a1,process_b1,process_a2.process_b2,process_a3,process_b3,可能导致错误数据出现.

相比之下,协程里的多线程(的共享数据访问)则是不需要加锁的!因为从用户层面看,协程是多线程的。但虚拟机层面,其实单线程的,协程内部进行cpu执行权利的自行控制。关于单线程实现多线程并发执行,可参考 博文”并发之一基本概念的事件模型部分”。

同进程不同线程可运行在不同核心上?

这个还要看编程语言的线程模型。某些语言(如python)的线程模型不支持并行运行在多个核上
实际上有些操作系统在内部并不分进程和线程,调度方式是一致的。比如Linux,共享内存的就是线程,不共享内存的就是进程,然后把包装好的创建函数暴露给POSIX API。
现在同一进程下的多个线程是可以在多核CPU下并行运行的。但2.4内核及以前的系统实现的线程没有内核支持,无法在多核的情况下并行运行。
多线程的概念主要有两种:一种是用户态多线程;一种是内核态多线程
内核态多线程,如楼上所言,在操作系统内核的支持下可以在多核下并行运行;
对于用户态多线程,尽管没有内核的直接支持,但若一个用户态线程对应于内核的一个进程的话(从这个角度,内核还是间接支持的),仍然是可以在多核上并行运行的。
因此,这归结为,用户态多线程的实现技术。
似乎目前Linux上的用户态多线程,就是利用了内核的进程来实现的。
如果是内核线程(就是fork出来的,pthread_create在2.4后最终也用fork,具体参看其实现),那么可以调度到多cpu,内核支持线程的诱导因素之一就是可以利用多cpu资源进行并行计算;如果是用户线程,那么就不能在多cpu上并行计算了,用户库线程的弊端之一就是不能利用多cpu资源;

线程是并发还是并行,进程是并发还是并行?

线程是并发进程是并行
现代os都将线程作为最小调度单位,进程作为资源分配的最小单位

父子进程如何区分?

​ 子进程是父进程通过fork()产生出来的,pid = os.fork()
​ 通过返回值pid是否为0,判断是否为子进程,如果是0,则表示是子进程
​ 由于 fork() 是 Linux 上的概念,所以如果要跨平台,最好还是使用 subprocess 模块来创建子进程。

子进程如何回收?

python中采用os.wait()方法用来回收子进程占用的资源
pid, result = os.wait() # 回收子进程资源 阻塞,等待子进程执行完成回收
如果有子进程没有被回收的,但是父进程已经死掉了,这个子进程就是僵尸进程。孤儿进程,父类进程over.,子进程未结束

使用多处理池的apply_async方法时,谁运行回调

回调在主进程中处理,但单独线程(循环方式依次处理)
参考:使用多处理池的apply_async方法时,谁运行回调?

异常处理,异常消失问题

参考

进程和线程、协程的区别
进程 vs. 线程
以Python爬取数据为例,多线程和多进程的优劣
在多核CPU下,同一进程下的多个线程可以并行运行吗
python并发编程之多进程(实践篇)
python多进程原理及其实现(1-6总结,较好)
python之路多进程和多线程总结(四)
一文看懂Python多进程与多线程编程(工作学习面试必读)
搞定python多线程和多进程(详细)
Python的进程间通信
Python进程间共享数据(三)(dict、list)
多进程,多线程,协程实现简单举例
异步IO、多线程、多进程
Python开发【第九章】:线程、进程和协程
multiprocess模块使用进程池调用apply_async()提交的函数及回调函数不执行问题

python进阶07并发之三其他问题相关推荐

  1. python进阶07 MySQL

    python进阶07 MySQL 一.MySQL基本结构 1.认识MySQL #MySQL不是数据库,它是数据库管理软件 #MySQL如何组织数据 #如何进入MySQL数据库 #其他注意事项#以表格的 ...

  2. python进阶12并发之八多线程与数据同步

    原创博客地址:python进阶12并发之八多线程与数据同步 python并发首选进程,但偶尔有场景进程无法搞定,比如有些变量是无法序列化的,就无法使用工具包manager()的工具类进行共享.如果自己 ...

  3. python进阶11并发之七多种并发方式的效率测试

    原创博客地址:python进阶11并发之七多种并发方式的效率测试 测试map,apply_async,gevent协程爬虫 测试代码:网页爬虫 函数代码 1 2 3 4 5 6 7 8 9 10 11 ...

  4. python进阶10并发之六并行化改造

    原创博客地址:python进阶10并发之六并行化改造 图示变量含义说明: 1个大step中包含3个小step,大step内部的第一步,二步,三步存在依赖关系(就是内部保持顺序执行) a1,b1,c1, ...

  5. python进阶09并发之五生产者消费者

    原创博客地址:python进阶09并发之五生产者消费者 这也是实际项目中使用较多的一种并发模式,用Queue(JoinableQueue)实现,是Python中最常用的方式(这里的queue特指mul ...

  6. python进阶08并发之四map, apply, map_async, apply_async差异

    原创博客地址: python进阶08并发之四map, apply, map_async, apply_async差异 差异矩阵 python封装了4种常用方法,用于实现并发 其差异如下   Multi ...

  7. python进阶05并发之一基本概念

    原创博客地址:python进阶05并发之一基本概念 大多编程语言,一旦涉及并发,都会比较复杂,知识点也较多(大多为历史问题,很多技术点现在非常少使用了,但语言层面也提供支持,对于这些冷门点,只需要知道 ...

  8. Python进阶07 函数对象

    秉承着一切皆对象的理念,我们再次回头来看函数(function).函数也是一个对象,具有属性(可以使用dir()查询).作为对象,它还可以赋值给其它对象名,或者作为参数传递. lambda函数 在展开 ...

  9. python socket udp并发_Python进阶----UDP协议使用socket通信,socketserver模块实现并发

    Python进阶----UDP协议使用socket通信,socketserver模块实现并发 一丶基于UDP协议的socket 实现UDP协议传输数据 代码如下:

最新文章

  1. Stormpath发布了简化移动和前端身份验证的客户端API
  2. Redis 哨兵架构基础
  3. 处理器仿存带宽_linux服务器CPU内存硬盘读写带宽等性能测试方法
  4. order by case when
  5. 网络克隆报a:\ghosterr.txt故障解决一例
  6. Android 如何退出整个应用程序?
  7. ubuntu 安装php mcrypt扩展
  8. 把body中的html隐藏,JAVA通过正则匹配html里面body标签的内容,去掉body标签
  9. 视频教程-汇编语言程序设计-其他
  10. 基于秃鹰搜索算法的无线传感器网络三维覆盖优化
  11. 虚拟搭建局域网模拟器_如何建立虚拟局域网
  12. 莫纳什计算机专业优势,2020年去澳洲留学就读莫纳什大学计算机学院有哪些优势?...
  13. 配置类不加@Configuration竟然也可以注册bean
  14. AGM FPGA之AG10K 系列的开发建议(连载二)
  15. 养老院人员定位系统包含室内人员定位,老人防跌倒报警系统-新导智能
  16. 记一次网易七鱼云客服开发记录
  17. cordova build android遇到的问题
  18. git时出现! [rejected] master -> master (non-fast-forward)解决方法
  19. 干货|红外热成像摄像头拆解分析
  20. beego框架搭建遇到问题

热门文章

  1. 如何用管程实现生产者消费者问题?
  2. java项目.gitignore文件过滤规则
  3. 使用netkit搭pppoe服务器
  4. mongodb的安装与简单操作
  5. redis cluster以及master-slave在windows下环境搭建
  6. 如何获取不重复的随机数
  7. 王立平--android事件监听的3种方式
  8. ASP.NET之Ajax系列(三)
  9. 计算机网络学习1-网络层次
  10. 国庆七天乐 Day7