三、进程和线程、协程在python中的使用
三、进程和线程、协程在python中的使用
1、多进程一般使用multiprocessing库,来利用多核CPU,主要是用在CPU密集型的程序上,当然生产者消费者这种也可以使用。多进程的优势就是一个子进程崩溃并不会影响其他子进程和主进程的运行,但缺点就是不能一次性启动太多进程,会严重影响系统的资源调度,特别是CPU使用率和负载。使用多进程可以查看文章《python 多进程使用总结》。注:python2的进程池在类中的使用会有问题,需要把类函数定义成全局函数。具体可参考 http://bbs.chinaunix.net/thread-4111379-1-1.html
2、多线程一般是使用threading库,完成一些IO密集型并发操作。多线程的优势是切换快,资源消耗低,但一个线程挂掉则会影响到所有线程,所以不够稳定。现实中使用线程池的场景会比较多,具体可参考《python线程池实现》。
3、协程一般是使用gevent库,当然这个库用起来比较麻烦,所以使用的并不是很多。相反,协程在tornado的运用就多得多了,使用协程让tornado做到单线程异步,据说还能解决C10K的问题。所以协程使用的地方最多的是在web应用上。
总结一下就是IO密集型一般使用多线程或者多进程,CPU密集型一般使用多进程,强调非阻塞异步并发的一般都是使用协程,当然有时候也是需要多进程线程池结合的,或者是其他组合方式。
下面我们使用进程加协程来做加法和乘法的计算任务同时计算,也就是并发计算:

# coding:utf-8
import gevent
import multiprocessing,os
import time def f1(s):
a = s
while a<33:
a = a + 1
print('计算相加 进程ID:%s'%os.getpid(),a)
# gevent.sleep(1) def f2(s):
d=1
for i in range(s,30):
d = d*i
print('计算相乘 进程ID:%s'%os.getpid(),d)
# gevent.sleep(1)
def gv1(i):
g1 = gevent.spawn(f1, i)
g1.join()
def gv2 (i):
g2 = gevent.spawn(f2, i)
g2.join()
if __name__=='__main__':
start = time.clock() # # 进程池
# pool = multiprocessing.Pool(2)
# pool.apply_async(gv1,(1,))
# pool.apply_async(gv2,(1,))
# pool.close()
# pool.join() # 单开进程
pool = []
p1 = multiprocessing.Process(target=f1,args=(1,))
p2 = multiprocessing.Process(target=f2,args=(1,))
pool.append(p1)
pool.append(p2)
p1.start()
p2.start()
for item in pool:
item.join()
print(time.clock()-start)


三、进程和线程、协程在python中的使用的更多相关文章
- 协程及Python中的协程
		
1 协程 1.1协程的概念 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程.(其实并没有说明白~) 我觉得单说协程,比较抽象,如果对线程有一定了解 ...
 - Python 进程线程协程 GIL 闭包 与高阶函数(五)
		
Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁  线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...
 - python进阶——进程/线程/协程
		
1 python线程 python中Threading模块用于提供线程相关的操作,线程是应用程序中执行的最小单元. #!/usr/bin/env python # -*- coding:utf-8 - ...
 - python自动化开发学习 进程, 线程, 协程
		
python自动化开发学习 进程, 线程, 协程 前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...
 - Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程
		
1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...
 - Python学习---线程/协程/进程学习 1220【all】
		
Python学习---线程基础学习 Python学习---线程锁/信号量/条件变量同步1221 Python学习---同步条件event/队列queue1223 Python学习---进程 1225 ...
 - 进程、线程、轻量级进程、协程和go中的Goroutine
		
进程.线程.轻量级进程.协程和go中的Goroutine 那些事儿电话面试被问到go的协程,曾经的军伟也问到过我协程.虽然用python时候在Eurasia和eventlet里了解过协程,但自己对协程 ...
 - 进程&线程&协程
		
进程 一.基本概念 进程是系统资源分配的最小单位, 程序隔离的边界系统由一个个进程(程序)组成.一般情况下,包括文本区域(text region).数据区域(data region)和堆栈(stac ...
 - 多道技术 进程  线程 协程  GIL锁   同步异步  高并发的解决方案   生产者消费者模型
		
本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...
 
随机推荐
- CDH6.3.0 - Cloudera Enterprise 6 Release Guide 安装准备篇
			
一.安装之前 Cloudera管理器的存储空间规划 ClouderaManager跟踪许多后台流程中的服务.作业和应用程序的指标.所有这些指标都需要存储.根据组织的大小,此存储可以是本地的或远程的,基 ...
 - MySQL数据库忘记密码怎么办?
			
忘记MySQL数据库密码就进不去数据库,也就无法修改密码,解决方法如下: 1:打开cmd命令符,先关闭正在运行的数据库,输入如下命令: 2:打开mysql.exe和mysqld.exe所在的文件夹,复 ...
 - CentOS7 搭建php环境
			
1,先安装apache: yum install httpd 配置ServerName,进入httpd.conf文件: vi /etc/httpd/conf/httpd.conf 将#ServerNa ...
 - node学习笔记(一)本地文件目录查看器
			
Node.js 新闻 nw.js 前端开发桌面应用 内容 node.js实战 照例提供百度云链接,本来以为是实战系列的那本,但不是,不过这本也不错 链接:https://pan.baidu.com/s ...
 - php基础——语法、变量
			
一.php语法: 1.php语言需要写在<?php ?>标签里面 2.php语言每行结束需要使用:作为结束符 3.php是一门弱语言,不要求先声明变量 4.可嵌套在HTML和js语言中 ...
 - Win10下80端口被System占用导致Apache无法启动
			
Windows10下80端口被PID为4的System占用导致Apache无法启动的分析与解决方案 方法/步骤 最近更新了Windows10,总体上来说效果还是蛮不错的,然而今天在开启Apac ...
 - 实现一个图片轮播-3d播放效果
			
前言:最近在做一个音乐播放器,首页要做一个图片轮播,看了bootstrap的carousel插件以及移动端的swipe.js库,都是平面图片轮播的效果,所以自己想着实现类似网易云app里那种3d图片轮 ...
 - hover和position共用出现的问题
			
hover 鼠标移入的样式 position 定位属性 包含 relative 相对定位 absolute 绝对定位为 fixed 固定定位 hover作用范围 可以实现自己样式的 ...
 - latex转word公式  java (latextoword,latex_word,latex2word,latex_omml)
			
latex_word 主要目的: 给大家分享一个我的原创作品:latex转为word公式(omml)工具 [java] 此工具主要用于将含有latex公式的文本下载成word时,将latex转 ...
 - BootstrapVue 安装指南
			
BootstrapVue 是基于 Bootstrap v4 + Vue.js 的前端 UI 框架.BootstrapVue 作为学习 Vue.js 框架本身的入门框架,我认为是非常不错的.Bootst ...