一、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

构造函数-参数:

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核心数:

标准库- 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并发解决方案的更多相关文章

  1. Python并发编程-并发解决方案概述

    Python并发编程-并发解决方案概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.并发和并行区别 1>.并行(parallel) 同时做某些事,可以互不干扰的同一个时 ...

  2. Python并发编程二(多线程、协程、IO模型)

    1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...

  3. Python并发编程一(多进程)

    1.背景知识(进程.多道技术) 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一 ...

  4. python 并发和线程

    并发和线程 基本概念 - 并行.并发 并行, parallel 互不干扰的在同一时刻做多件事; 如,同一时刻,同时有多辆车在多条车道上跑,即同时发生的概念. 并发, concurrency 同时做某些 ...

  5. python并发编程&多进程(二)

    前导理论知识见:python并发编程&多进程(一) 一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_cou ...

  6. python并发编程之线程/协程

    python并发编程之线程/协程 part 4: 异步阻塞例子与生产者消费者模型 同步阻塞 调用函数必须等待结果\cpu没工作input sleep recv accept connect get 同 ...

  7. 关于SQL SERVER高并发解决方案

    现在大家都比较关心的问题就是在多用户高并发的情况下,如何开发系统,这对我们程序员来说,确实是值得研究,最近找工作面试时也经常被问到,其实我早有去关心和了解这类问题,但一直没有总结一下,导致面试时无法很 ...

  8. Python并发编程__多进程

    Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...

  9. 你不能错过.net 并发解决方案

    BlockingCollection集合是一个拥有阻塞功能的集合,它就是完成了经典生产者消费者的算法功能.所以BlockingCollection 很适合构造流水线模式的并发方案 BlockingCo ...

随机推荐

  1. JS 实现右下角弹窗

    <!DOCTYPE HTML> <head> <title>JS实现右下角弹窗</title> <meta http-equiv="co ...

  2. memory_profiler的使用

    作用:memory_profiler是用来分析每行代码的内存使用情况 使用方法一: 1.在函数前添加 @profile 2.运行方式: python -m memory_profiler memory ...

  3. C#;DataTable添加列;DataTable转List泛型集合;List泛型集合转DataTable泛型集合;

    给DataTable添加列 string sql = "select * from cgpmb order by code"; DataTable dt = Bobole.Data ...

  4. 前端人员使用notepad++基本配置

    截图说明: 以上截图说的很明确了,基本满足基本的开发. notepad++前端配置版支持Emmet快速完成:支持Explorer目录管理:支持cmd控制台命令:支持MarkDown编辑预览:其他想用的 ...

  5. 通过Loadruner对mysql数据库进行增删改查

    操作mysql数据库,是在实现mysql数据源配置的基础上操作,可先阅读:loadrunner参数化使用mysql数据源失败解决方法 写之前先理一下,数据库访问流程:打开数据库  --> 数据库 ...

  6. CentOS使用nginx部署https服务

    nginx安装参考:https://www.cnblogs.com/taiyonghai/p/6728707.html 自签证书生成参考:https://gmd20.github.io/blog/op ...

  7. MySQL(进阶部分)

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( SEL ...

  8. windows快速搭建FTP工具Serv-U FTP Server

    本文介绍一个简单的FTP工具,当然windows系统自带FTP工具,但是配置方法没有第三方工具来的简单可操作性好. 此工具用于搭建FTP环境,对于需要测试FTP上传功能具有极大帮助.例如球机抓拍图片上 ...

  9. springboot学习随笔(二):简单的HelloWorld

    接上章搭建好springboot环境后,开始开发入门级HelloWorld 一.构建简单的springboot项目 1.新建项目,选择Spring/Spring Starter Project 2.N ...

  10. 李清华201772020113《面向对象程序设计(java)》第十一周学习总结

    实验十一   集合 实验时间 2018-11-8 1.实验目的与要求 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: (2) 了解java集合框架体系组成: (3) ...