Python并发解决方案
一、subprocess模块
call():执行命令,返回程序返回码(int)
import subprocess
print(subprocess.call("mspaint"))
check_output():执行命令,返回输出(bytes)
import subprocess
import chardet
output = subprocess.check_output("ipconfig")
encoding = chardet.detect(output)['encoding']
print(output.decode(encoding, errors="ignore"))
二、threading模块
Thread
构造函数-参数:
target: 执行的操作(可调用对象,必选的)
name: 线程名(字符串,可选的)
args: 可调用对象需要的参数(位置参数部分,元组)
kwargs: 可调用对象需要的参数(关键字参数部分,字典)
from threading import Thread
t = Thread(
target=print,
args=(1, 2, 3),
kwargs={'sep': '->', 'end': '\n' * 10}
)
t.start()
方法:
start(): 启动线程(开始交给CPU执行)
run():start()启动之后,会被自动调用的方法。(子类可重写)
join(): 让父级线程等待自己完成(必须要在调用start()之后才能调用)
属性:
name:线程名称
daemon:是否是后台线程(若要设置该值,必须要在调用start()方法之前)
ident: 线程ID
Event:
set(): 设置值为True
clear(): 设置值为False
wait(): 等待
is_set():判断值是否为True
函数:
main_thread():得到主线程对象
active_count():得到活跃线程数目
current_thread():得到当前所在的线程对象
enumerate():返回迭代器,得到所有的活跃线程
关于daemon:
在脚本运行过程中有一个主线程,若在主线程中创建了子线程,当主线程结束时根据子线程daemon属性值的不同可能会发生下面的两种情况之一:
如果某个子线程的daemon属性为False,主线程结束时会检测该子线程是否结束,如果该子线程还在运行,则主线程会等待它完成后再退出;
如果某个子线程的daemon属性为True,主线程运行结束时不对这个子线程进行检查而直接退出,同时所有daemon值为True的子线程将随主线程一起结束,而不论是否运行完成。
属性daemon的值默认为False,如果需要修改,必须在调用start()方法启动线程之前进行设置。
另外要注意的是,上面的描述并不适用于IDLE环境中的交互模式或脚本运行模式,因为在该环境中的主线程只有在退出Python IDLE时才终止。
三、multiprocessing模块
Process() 创建一个进程对象,构造函数参数如下
target:要执行的操作(函数)(必须)
name:进程名(可选)
args:传递给target的函数执行时需要的位置、可选参数(按位置指定)
kwargs:传递给target的函数执行时需要的关键字参数(按名称指定)
进程对象(实例)方法:
start():启动进程
run():进程启动后,实际执行的方法,一般重写此方法。
terminate():强制结束进程
join():等待所有子进程执行完成
进程对象(实例)属性:
name:进程名
daemon:是否是后台进程
pid: 进程id
Pool(),创建一个进程池,构造函数参数(都是可选的)如下:
numprocess:进程池大小(同时有几个进程在工作)(默认为当前电脑的CPU核心数)
initializer:每个进程启动时执行的操作(函数)
initargs:传递给initializer的函数执行需要的参数(元组)
Pool对象方法:
执行方法:
apply(func, args, kwargs):(同步)执行一个。(返回值,func的返回结果)
apply_async(func, args, kwargs):(异步)执行一个。(返回值:ApplyResult,与AsyncResult类似,需要在进程池中所有任务完成后调用其get()方法取数据)
map(func,iterable, chunksize):(同步)一次取N个放到进程池中执行(N为进程池大小),等到本次取出的都执行完了再取下一批。(返回值:list,与外部数据顺序一致)
map_async(func,iterable, chunksize):(异步)一次取N个放到进程池中执行(N为进程池大小),只要进程池中有空闲位置,就取会数据,保证进程池一直是忙碌的。(返回值: AsyncResult,需要在进程池中所有任务完成后调用其get()方法取数据)
imap(func, iterable, chunksize):与map()类似,返回可迭代对象,返回数据的顺序和外部传递的数据顺序一致。
imap_unordered(func, iterable, chunksize):与map()类似,但是返回数据的顺序不能确定(当对数据顺序没有要求时使用)。
进程池管理方法():
close():关闭进程池,但是会等待池中作业完成
terminate():停止进程池中的作业,会关闭进程池
join():等待进程池中所有任务完成(需要先关闭进程池)
AsyncResult方法:
get(timeout):timeout可选。获取结果
ready():判断进程池中任务是否执行完毕。
successful():判断进程池中任务是否都正常完成了(只要有一个进程出错了,就会返回False)。
wait(timeout):timeout可选。
Manager()托管对象。
dict(): 共享字典
Event(): 共享事件
list(): 共享列表
Value(typecode, value): 共享的单个值
multiprocessing.dummy.Pool() 线程池:
from multiprocessing.dummy import Pool as ThreadPool
pool_size = 4 # 线程池大小
tpool = ThreadPool(pool_size) # 创建线程池
进程池有的方法,线程池都有。
获取CPU核心数:
标准库- multiprocessingimport multiprocessing
multiprocessing.cpu_count()
第三方- psutilimport psutil
psutil.cpu_count()
注意:Python中的多进程,启动代码需要在if__name__ == "__main__"中,多进程代码,不能在交互式环境中执行,应该使用python xxx.py的方式执行。
参考:17.2. multiprocessing — Process-based parallelism
附加:
numpy
.mean():求平均值
.sum(): 求和
uuid
uuid4():生成唯一id(UUID类型,可以通过str()转成字符串)
1.
subprocess模块
2.
threading模块
3.
multiprocessing模块
一、
subprocess模块
call():执行命令,返回程序返回码(int)
|
import subprocess print(subprocess.call("mspaint")) |
check_output():执行命令,返回输出(bytes)
|
import subprocess import chardet output = subprocess.check_output("ipconfig") encoding = chardet.detect(output)['encoding'] print(output.decode(encoding, errors="ignore")) |
二、
threading模块
Thread
构造函数-参数:
n target: 执行的操作(可调用对象,必选的)
n name: 线程名(字符串,可选的)
n args: 可调用对象需要的参数(位置参数部分,元组)
n kwargs: 可调用对象需要的参数(关键字参数部分,字典)
|
from threading import Thread t = Thread( target=print, args=(1, 2, 3), kwargs={'sep': '->', ) t.start() |
方法:
n start(): 启动线程(开始交给CPU执行)
n run():start()启动之后,会被自动调用的方法。(子类可重写)
n join(): 让父级线程等待自己完成(必须要在调用start()之后才能调用)
属性:
n name:线程名称
n daemon:是否是后台线程(若要设置该值,必须要在调用start()方法之前)
n ident: 线程ID
Event:
n set(): 设置值为True
n clear(): 设置值为False
n wait(): 等待
n is_set():判断值是否为True
函数:
n main_thread():得到主线程对象
n active_count():得到活跃线程数目
n current_thread():得到当前所在的线程对象
n enumerate():返回迭代器,得到所有的活跃线程
关于daemon:
在脚本运行过程中有一个主线程,若在主线程中创建了子线程,当主线程结束时根据子线程daemon属性值的不同可能会发生下面的两种情况之一:
l 如果某个子线程的daemon属性为False,主线程结束时会检测该子线程是否结束,如果该子线程还在运行,则主线程会等待它完成后再退出;
l 如果某个子线程的daemon属性为True,主线程运行结束时不对这个子线程进行检查而直接退出,同时所有daemon值为True的子线程将随主线程一起结束,而不论是否运行完成。
属性daemon的值默认为False,如果需要修改,必须在调用start()方法启动线程之前进行设置。
另外要注意的是,上面的描述并不适用于IDLE环境中的交互模式或脚本运行模式,因为在该环境中的主线程只有在退出Python IDLE时才终止。
三、
multiprocessing模块
Process() 创建一个进程对象,构造函数参数如下
u target:要执行的操作(函数)(必须)
u name:进程名(可选)
u args:传递给target的函数执行时需要的位置、可选参数(按位置指定)
u kwargs:传递给target的函数执行时需要的关键字参数(按名称指定)
进程对象(实例)方法:
n start():启动进程
n run():进程启动后,实际执行的方法,一般重写此方法。
n terminate():强制结束进程
n join():等待所有子进程执行完成
进程对象(实例)属性:
n name:进程名
n daemon:是否是后台进程
n pid: 进程id
Pool(),创建一个进程池,构造函数参数(都是可选的)如下:
u numprocess:进程池大小(同时有几个进程在工作)(默认为当前电脑的CPU核心数)
u initializer:每个进程启动时执行的操作(函数)
u initargs:传递给initializer的函数执行需要的参数(元组)
Pool对象方法:
执行方法:
n apply(func, args, kwargs):(同步)执行一个。(返回值,func的返回结果)
n apply_async(func, args, kwargs):(异步)执行一个。(返回值:ApplyResult,与AsyncResult类似,需要在进程池中所有任务完成后调用其get()方法取数据)
n map(func,iterable, chunksize):(同步)一次取N个放到进程池中执行(N为进程池大小),等到本次取出的都执行完了再取下一批。(返回值:list,与外部数据顺序一致)
n map_async(func,iterable, chunksize):(异步)一次取N个放到进程池中执行(N为进程池大小),只要进程池中有空闲位置,就取会数据,保证进程池一直是忙碌的。(返回值: AsyncResult,需要在进程池中所有任务完成后调用其get()方法取数据)
n imap(func, iterable, chunksize):与map()类似,返回可迭代对象,返回数据的顺序和外部传递的数据顺序一致。
n imap_unordered(func, iterable, chunksize):与map()类似,但是返回数据的顺序不能确定(当对数据顺序没有要求时使用)。
进程池管理方法():
u close():关闭进程池,但是会等待池中作业完成
u terminate():停止进程池中的作业,会关闭进程池
u join():等待进程池中所有任务完成(需要先关闭进程池)
AsyncResult方法:
l get(timeout):timeout可选。获取结果
l ready():判断进程池中任务是否执行完毕。
l successful():判断进程池中任务是否都正常完成了(只要有一个进程出错了,就会返回False)。
l wait(timeout):timeout可选。
Manager()托管对象。
n dict(): 共享字典
n Event(): 共享事件
n list(): 共享列表
n Value(typecode, value): 共享的单个值
multiprocessing.dummy.Pool() 线程池:
|
from multiprocessing.dummy import Pool as pool_size = 4 # 线程池大小 tpool = ThreadPool(pool_size) # 创建线程池 |
进程池有的方法,线程池都有。
获取CPU核心数:
|
标准库- multiprocessing |
import multiprocessing multiprocessing.cpu_count() |
|
第三方- psutil |
import psutil psutil.cpu_count() |
注意:Python中的多进程,启动代码需要在if__name__
== "__main__"中,多进程代码,不能在交互式环境中执行,应该使用python xxx.py的方式执行。
参考:17.2.
multiprocessing — Process-based parallelism
附加:
numpy
.mean():求平均值
.sum(): 求和
uuid
uuid4():生成唯一id(UUID类型,可以通过str()转成字符串)
Python并发解决方案的更多相关文章
- Python并发编程-并发解决方案概述
Python并发编程-并发解决方案概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.并发和并行区别 1>.并行(parallel) 同时做某些事,可以互不干扰的同一个时 ...
- Python并发编程二(多线程、协程、IO模型)
1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...
- Python并发编程一(多进程)
1.背景知识(进程.多道技术) 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一 ...
- python 并发和线程
并发和线程 基本概念 - 并行.并发 并行, parallel 互不干扰的在同一时刻做多件事; 如,同一时刻,同时有多辆车在多条车道上跑,即同时发生的概念. 并发, concurrency 同时做某些 ...
- python并发编程&多进程(二)
前导理论知识见:python并发编程&多进程(一) 一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_cou ...
- python并发编程之线程/协程
python并发编程之线程/协程 part 4: 异步阻塞例子与生产者消费者模型 同步阻塞 调用函数必须等待结果\cpu没工作input sleep recv accept connect get 同 ...
- 关于SQL SERVER高并发解决方案
现在大家都比较关心的问题就是在多用户高并发的情况下,如何开发系统,这对我们程序员来说,确实是值得研究,最近找工作面试时也经常被问到,其实我早有去关心和了解这类问题,但一直没有总结一下,导致面试时无法很 ...
- Python并发编程__多进程
Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...
- 你不能错过.net 并发解决方案
BlockingCollection集合是一个拥有阻塞功能的集合,它就是完成了经典生产者消费者的算法功能.所以BlockingCollection 很适合构造流水线模式的并发方案 BlockingCo ...
随机推荐
- Android 开发 记录一个DP、PX、SP转换工具类
public class UnitConversionUtil { /** * 根据手机分辨率从DP转成PX * @param context * @param dpValue * @return * ...
- 四、Python-元组
列表非常适合用于存储在程序运行期间可能变化的数据集.列表是可以修改的,这对处理网 站的用户列表或游戏中的角色列表至关重要. Python将不能修改的值称为不可变的,而不可变的列表被称为元组 一.元组( ...
- 在eclipse下,用Maven创建Spring MVC工程
参考链接:https://www.cnblogs.com/yangyxd/p/5955630.html 1.打开Eclipse,Ctrl + N 创建Maven
- wdk1703+vs2015编译的诡异问题
最近将wdk升级到1703(10.0.15063.0)版本,编译一个新建的minifiter项目居然出现了失败 提示错误为 WindowsDriver.common.targets(460,5): e ...
- springboot学习随笔(四):Springboot整合mybatis(含generator自动生成代码)
这章我们将通过springboot整合mybatis来操作数据库 以下内容分为两部分,一部分主要介绍generator自动生成代码,生成model.dao层接口.dao接口对应的sql配置文件 第一部 ...
- ECharts教程
ECharts 特性 兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等) 底层依赖轻量级的矢量图形库 ZRender 丰富的可视化类型 常规的折线图.柱状图 ...
- Django 请求类型
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get ...
- 进制与进制转换DAY2
进制和进制转换 一.进制的基础 1.十进制(案例) 系数:0-9 进位规则:逢十进一 权:基数的次幂 基数:几进制基数就是几 规律:右侧第一位的权是10的0次幂,每向左移动一位次幂会+1. 进制的表示 ...
- JS写一个简单日历
JS写一个日历,配合jQuery操作DOM <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...
- activiti官网实例项目activiti-explorer之扩展流程节点属性
节点中添加“关联表单”属性 1,stencilset.json中加入如下代码 , { "name" : "approveTypepackage", ...