多进程multiprocessing
PACKAGE CONTENTS
connection
dummy (package)
forking
heap
managers
pool
process
queues
reduction
sharedctypes
synchronize
util
module package
the class frequently-used of the module:
1、Process
Process 类用来描述一个进程对象。创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建。
star() 方法启动进程,
join() 方法实现进程间的同步,等待所有进程退出。
close() 用来阻止多余的进程涌入进程池 Pool 造成进程阻塞。
class Process(__builtin__.object)
| Process objects represent activity that is run in a separate process
|
| The class is analagous to `threading.Thread`
|
| Methods defined here:
|
| __init__(self, group=None, target=None, name=None, args=(), kwargs={})
|
| __repr__(self)
|
| is_alive(self)
| Return whether process is alive
|
| join(self, timeout=None)
| Wait until child process terminates
|
| run(self)
| Method to be run in sub-process; can be overridden in sub-class
|
| start(self)
| Start child process
|
| terminate(self)
| Terminate process; sends SIGTERM signal or uses TerminateProcess()
Process Class
#1、设置daemon都为True
import multiprocessing
import time,datetime
def create_test_function(statement):
time.sleep(2)
print(statement)
if __name__ == "__main__":
print("first")
create_one_process = multiprocessing.Process(target=create_test_function,args=("good",))
create_one_process.daemon = True
create_one_process.start()
print("second")
create_two_process = multiprocessing.Process(target=create_test_function,args=("nice",))
create_two_process.daemon = True
create_two_process.start()
print("third")
'''
output:
first
second
third
''' #2、设置daemon都为False
import multiprocessing
import time,datetime
def create_test_function(statement):
time.sleep(2)
print(statement)
if __name__ == "__main__":
print("first")
create_one_process = multiprocessing.Process(target=create_test_function,args=("good",))
create_one_process.daemon = False
create_one_process.start()
print("second")
create_two_process = multiprocessing.Process(target=create_test_function,args=("nice",))
create_two_process.daemon = False
create_two_process.start()
print("third")
'''
output:
first
second
third
good
nice
''' #3、设置daemon一个True一个False
import multiprocessing
import time,datetime
def create_test_function(statement):
time.sleep(2)
print(statement)
if __name__ == "__main__":
print("first")
create_one_process = multiprocessing.Process(target=create_test_function,args=("good",))
create_one_process.daemon = True
create_one_process.start()
print("second")
create_two_process = multiprocessing.Process(target=create_test_function,args=("nice",))
create_two_process.daemon = False
create_two_process.start()
print("third")
'''
output:
first
second
third
nice
''' #4、设置daemon一个False一个True
import multiprocessing
import time,datetime def create_test_function(statement):
time.sleep(2)
print(statement) if __name__ == "__main__":
print("first")
create_one_process = multiprocessing.Process(target=create_test_function,args=("good",))
create_one_process.daemon = False
create_one_process.start()
print("second")
create_two_process = multiprocessing.Process(target=create_test_function,args=("nice",))
create_two_process.daemon = True
create_two_process.start()
print("third")
'''
output:
first
second
third
good
'''
设置daemon
import multiprocessing
import time,datetime
def create_test_function(statement):
time.sleep(2)
print(statement)
if __name__ == "__main__":
print("first")
create_one_process = multiprocessing.Process(target=create_test_function,args=("",))
create_one_process.daemon = True
create_one_process.start()
create_one_process.join()
print("second")
create_two_process = multiprocessing.Process(target=create_test_function,args=("",))
create_two_process.daemon = True
create_two_process.start()
#create_two_process.join()
print("third")
'''output:
first
1
second
third
''' import multiprocessing
import time,datetime
def create_test_function(statement):
time.sleep(2)
print(statement)
if __name__ == "__main__":
print("first")
create_one_process = multiprocessing.Process(target=create_test_function,args=("",))
create_one_process.daemon = True
create_one_process.start()
create_one_process.join()
print("second")
create_two_process = multiprocessing.Process(target=create_test_function,args=("",))
create_two_process.daemon = True
create_two_process.start()
create_two_process.join()
print("third")
'''output:
first
1
second
2
third
'''
设置join
import multiprocessing
import time,datetime
def create_test_function(statement):
time.sleep(2)
print(statement)
if __name__ == "__main__":
for i in xrange(4):
create_one_process = multiprocessing.Process(target=create_test_function,args=(i,))
create_one_process.daemon = True
create_one_process.start()
create_one_process.join()
print("cheers")
2、Queue
Queue的功能是将每个核或线程的运算结果放在队里中, 等到每个线程或核运行完毕后再从队列中取出结果, 继续加载运算。原因很简单, 多线程调用的函数不能有返回值, 所以使用Queue存储多个线程运算的结果。
import multiprocessing as mp def job(q):
res=0
for i in range(1000):
res+=i+i**2+i**3
q.put(res) #queue if __name__=='__main__':
q = mp.Queue()
p1 = mp.Process(target=job,args=(q,))
p2 = mp.Process(target=job,args=(q,))
p1.start()
p2.start()
p1.join()
p2.join()
res1 = q.get()
res2 = q.get()
print(res1+res2)
put和get
3、Pool
进程池就是我们将所要运行的东西,放到池子里,Python会自行解决多进程的问题。 Pool和之前的Process的不同点是丢向Pool的函数有返回值,而Process的没有返回值。
对于需要使用几个甚至十几个进程时,我们使用Process还是比较方便的,但是如果要成百上千个进程,用Process显然太笨了,multiprocessing提供了Pool类,即现在要讲的进程池,能够将众多进程放在一起,设置一个运行进程上限,每次只运行设置的进程数,等有进程结束,再添加新的进程。
Pool(processes =num):设置运行进程数,当一个进程运行完,会添加新的进程进去
apply_async(函数,(参数)):非阻塞,其中参数是tulpe类型,
apply(函数,(参数)):阻塞
close():关闭pool,不能再添加新的任务
terminate():结束运行的进程,不再处理未完成的任务
join():和Process介绍的作用一样, 但要在close或terminate之后使用。
import multiprocessing as mp def job(x):
return x*x
def multicore():
pool = mp.Pool()
res = pool.map(job, range(10))
print(res) if __name__ == '__main__':
multicore()
map
#coding=utf-8
#Pool默认大小是CPU的核数,我们也可以通过在Pool中传入processes参数即可自定义需要的核数量,
import multiprocessing as mp
def job(x):
return x*x
def multicore():
pool = mp.Pool(processes=3) # 定义CPU核数量为3
res = pool.map(job, range(10))
print(res) if __name__ == '__main__':
multicore()
Pool
#coding=utf-8
#apply_async()中只能传递一个值,它只会放入一个核进行运算,但是传入值时要注意是可迭代的,所以在传入值后需要加逗号, 同时需要用get()方法获取返回值。
import multiprocessing as mp
def job(x):
return x*x
def multicore():
pool = mp.Pool()
res = pool.map(job, range(10))
print(res)
res = pool.apply_async(job, (2,))
# 用get获得结果
print(res.get())
if __name__ == '__main__':
multicore()
apply_async
#coding=utf-8
#用 apply_async() 输出多个结果 。
import multiprocessing as mp
def job(x):
return x*x
def multicore():
pool = mp.Pool()
res = pool.map(job, range(10))
print(res)
res = pool.apply_async(job, (2,))
# 用get获得结果
print(res.get())
# 迭代器,i=0时apply一次,i=1时apply一次等等
multi_res = [pool.apply_async(job, (i,)) for i in range(10)]
# 从迭代器中取出
print([res.get() for res in multi_res])
if __name__ == '__main__':
multicore()
apply_async(二)
1、Pool默认调用是CPU的核数,传入processes参数可自定义CPU核数
2、map() 放入迭代参数,返回多个结果
3、apply_async()只能放入一组参数,并返回一个结果,如果想得到map()的效果需要通过迭代
4、共享内存
#我们可以通过使用Value数据存储在一个共享的内存表中。
import multiprocessing as mp
value1 = mp.Value('i', 0)
value2 = mp.Value('d', 3.14)
#其中d和i参数用来设置数据类型的,d表示一个双精浮点类型,i表示一个带符号的整型。
Value
#在Python的mutiprocessing中,有还有一个Array类,可以和共享内存交互,来实现在进程之间共享数据。 array = mp.Array('i', [1, 2, 3, 4])
#这里的Array和numpy中的不同,它只能是一维的,不能是多维的。同样和Value 一样,需要定义数据形式,否则会报错。
Array
各参数代表的数据类型
| Type code | C Type | Python Type | Minimum size in bytes |
| --------- | ------------------ | ----------------- | --------------------- |
| `'b'` | signed char | int | 1 |
| `'B'` | unsigned char | int | 1 |
| `'u'` | Py_UNICODE | Unicode character | 2 |
| `'h'` | signed short | int | 2 |
| `'H'` | unsigned short | int | 2 |
| `'i'` | signed int | int | 2 |
| `'I'` | unsigned int | int | 2 |
| `'l'` | signed long | int | 4 |
| `'L'` | unsigned long | int | 4 |
| `'q'` | signed long long | int | 8 |
| `'Q'` | unsigned long long | int | 8 |
| `'f'` | float | float | 4 |
| `'d'` | double | float | 8 |
各参数代表的数据类型
5、进程锁
为了解决不同进程抢共享资源的问题,我们可以用加进程锁来解决。
#coding=utf-8
import multiprocessing as mp
import time
def job(v, num, l):
l.acquire() # 锁住
for _ in range(5):
time.sleep(0.1)
v.value += num # 获取共享内存
print(v.value)
l.release() # 释放 def multicore():
l = mp.Lock() # 定义一个进程锁
v = mp.Value('i', 0) # 定义共享内存
p1 = mp.Process(target=job, args=(v,1,l)) # 需要将lock传入
p2 = mp.Process(target=job, args=(v,3,l))
p1.start()
p2.start()
p1.join()
p2.join() if __name__ == '__main__':
multicore()
Lock
多进程multiprocessing的更多相关文章
- 多进程Multiprocessing模块
多进程 Multiprocessing 模块 先看看下面的几个方法: star() 方法启动进程, join() 方法实现进程间的同步,等待所有进程退出. close() 用来阻止多余的进程涌入进程池 ...
- 13、多进程multiprocessing、进程池
内容相关: multiprocessing: 进程的创建与运行 进程常用相关函数 进程池: 为什么要有进程池 进程池的创建与运行:串行.并行 回调函数 多进程multiprocessing: pyth ...
- python ---多进程 Multiprocessing
和 threading 的比较 多进程 Multiprocessing 和多线程 threading 类似, 他们都是在 python 中用来并行运算的. 不过既然有了 threading, 为什么 ...
- 操作系统OS,Python - 多进程(multiprocessing)、多线程(multithreading)
多进程(multiprocessing) 参考: https://docs.python.org/3.6/library/multiprocessing.html 1. 多进程概念 multiproc ...
- Python 多进程 multiprocessing.Pool类详解
Python 多进程 multiprocessing.Pool类详解 https://blog.csdn.net/SeeTheWorld518/article/details/49639651
- python中多进程multiprocessing、多线程threading、线程池threadpool
浅显点理解:进程就是一个程序,里面的线程就是用来干活的,,,进程大,线程小 一.多线程threading 简单的单线程和多线程运行:一个参数时,后面要加逗号 步骤:for循环,相当于多个线程——t=t ...
- 物无定味适口者珍,Python3并发场景(CPU密集/IO密集)任务的并发方式的场景抉择(多线程threading/多进程multiprocessing/协程asyncio)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_221 一般情况下,大家对Python原生的并发/并行工作方式:进程.线程和协程的关系与区别都能讲清楚.甚至具体的对象名称.内置方法 ...
- Python多进程multiprocessing使用示例
mutilprocess简介 像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多. import multipr ...
- Python初学——多进程Multiprocessing
1.1 什么是 Multiprocessing 多线程在同一时间只能处理一个任务. 可把任务平均分配给每个核,而每个核具有自己的运算空间. 1.2 添加进程 Process 与线程类似,如下所示,但是 ...
随机推荐
- Burnside引理与Polya定理
感觉这两个东西好鬼畜= = ,考场上出了肯定不会qwq.不过还是学一下吧用来装逼也是极好的 群的定义 与下文知识无关.. 给出一个集合$G = \{a, b, c, \dots \}$和集合上的二元运 ...
- 逛csdn看见的一个知识阶梯,感觉不错
逛csdn看见的一个知识阶梯,感觉不错: 计算机组成原理 → DOS命令 → 汇编语言 → C语言(不包括C++).代码书写规范 → 数据结构.编译原理.操作系统 → 计算机网络.数据库原理.正则表 ...
- 预置第三方apk到MTK项目相关问题总结
目前5.0之后项目预置方式通用步骤为: 建立apk文件夹; 置目标apk到该文件夹下; 解压缩apk查看是否包含lib/文件夹(apk项目是否包含lib库文件); 在该文件夹下编写Androi ...
- C# 一般处理程序ashx接收服务端post过来json数据
这个和前端js的接收方式有点不一样,前端接收用request.form["xxx"]即可
- vue.js的手脚架vue-cli项目搭建的步骤
手脚架是什么? 众所周知,现在的前端项目发展得越渐越大,我们前端程序员要从0开始去搭建一套完整的项目很费时,所以这时候前端工程的手脚架就出现了. 我用得vue-cli也是其中之一,还有其他的我也说不清 ...
- 浅谈TCP IP协议栈(二)IP地址
上一节大致了解TCP/IP协议栈是个啥东西,依旧是雾里看花的状态,有很多时候学一门新知识时,开头总是很急躁,无从下手,刚学会一点儿,却发现连点皮毛都不算,成就感太低,所以任何时候学习最重要的是要在合适 ...
- c/c++ 网络编程 UDP 改变网卡的硬件地址
网络编程 UDP 改变网卡的硬件地址 在程序里动态改变网卡的硬件地址 1,取得网卡的硬件地址 #include <stdio.h> #include <string.h> #i ...
- windows下安装MongoDB扩展和配置
windows下安装MongoDB扩展和配置 1.下载mongoDB扩展,根据当前php版本进行下载 地址如下:http://pecl.php.net/package/mongo 我本地php版本是 ...
- GitHub下载克隆clone指定的分支tag代码
需求描述: 这边有很多tag分支版本的代码,我想克隆下载指定版本到我服务器上面 例如:我想下载tag:1.4.1的代码 解决方法: 命令:git clone --branch [tags标签] [gi ...
- 什么是POE交换机?
POE交换机和普通交换机的区别有: 1.POE交换机不但可以实现普通交换机的数据传输功能还能同时对网络终端进行供电 .普通的交换机主要是交换数据的功能,并没有具备供电的功能. 2.现在的网络高清摄像机 ...