Python 多进程库 multiprocessing ,支持子进程、通信、数据共享、执行不同形式的同步

多进程,绕过gil ,实现多核的利用,多进程也是原生进程,由操作系统维护

在pycharm中,可能没有办法正常使用multiprocessing.Process,最好是在Linux中运行

Process 用于创建进程模块
Pool 用于创建管理进程池
Queue 用于进程通信,资源共享
Pipe 用于管道通信
Manager 用于资源共享,同步进程                   

1.Process类


Process(group = None,target =None,name=None, args=[ ], kwargs={ })

group 线程组
target 要执行的方法
name 进程名
args/kwargs 要传入方法的参数                                       

process属性&方法:

authkey 进程的身份验证密钥
daemon 同thread的setDaemon,守护进程
exitcode 进程运行时为None,若为—N,则表示被信号N结束
pid 进程号
name 进程名
is_alive() 返回进程是否正在运行
join([timeout]) 阻塞到线程结束或到timeout值 
start() 进程准备就绪,等待CPU调度
run() start()调用run方法,如果实例进程时未制定传入target,start执行默认run()方法。         
terminate() 不管任务是否完成,立即停止工作进程

多进程的创建:

#!/usr/bin/python
# -*- coding:utf-8 -*-
'''多进程的创建'''
from multiprocessing import Process
import time def fun(name):
time.sleep(1)
print('hello,%s' % name)
print('----') if __name__ =='__main__':
for i in range(5): # 进程同步
p = Process(target=fun, args=('Presley',))
p.start()
p.join()
print('结束。')

多进程

进程id :

#!/usr/bin/python3
# -*- coding:utf-8 -*- from multiprocessing import Process
import os
def info(title):
print(title)
print('moudle name :',__name__)
print('parent process id ', os.getppid())
print('process id ', os.getpid()) if __name__ =='__main__':
info('hei. ') # pycharm id和 主进程id
for i in range(3):
p = Process(target=info, args=('Presley',)) # 主进程id 和 info 子进程id
p.start()
p.join()
hei.
moudle name : __main__
parent process id 1610
process id 1826
Presley
moudle name : __main__
parent process id 1826
process id 1827
Presley
moudle name : __main__
parent process id 1826
process id 1828
Presley
moudle name : __main__
parent process id 1826
process id 1829

result

2.Queue类


不同进程间内存是不共享的,想要实现两个进程间的数据交换,可以用Queue进行进程间通讯

queue是在多进程中做了一层封装的队列,以保证在当前进程里进程安全

方法:queue

进程中的队,以保证进程安全

from multiprocessing import Process,Queue
def info(q):
# global q # 错误,queue中 ,global 不行,因为子进程无法访问父进程的内存数据
q.put([34, None, 'yes']) if __name__ =='__main__':
q = Queue()
for i in range(3):
p = Process(target=info, args=[q,]) # 多个子进程的数据可以都可以放父进程数据
p.start()
print('来自父进程%s:%s'%(i, q.get()))
p.join()

多进程_queue

来自父进程0:[34, None, 'yes']
来自父进程1:[34, None, 'yes']
来自父进程2:[34, None, 'yes']

result

3.Pipe类


管道操作(双向队列):会返回一对对象,管道的两端分别赋给子进程和父进程

和队列操作差不多,所以一般运用队列较多

方法:

send() 发送序列
recv() 接收序列
fileno()  返回一个整型的文件描述符
close() 退出
poll()  判断子进程是否结束
send_bytes() 以bytes格式发送序列
recv_bytes() 以bytes格式接收序列                                   
from multiprocessing import Process,Pipe
import time
def info(conn):
time.sleep(0.5)
conn.send([32,None,'ni hao wa']) conn.close() if __name__=='__main__':
conn_parent ,conn_child = Pipe()
print(conn_parent.fileno()) for i in range(3):
p = Process(target=info,args=(conn_child,))
print(bool(conn_child.poll)) # 进程是否结束
p.start()
# 如果没有消息可接收,recv方法会一直阻塞。如果管道已经被关闭,那么recv方法会抛出EOFError。
print('父端接收%s:%s'% (i,conn_parent.recv())) p.join()

多进程_Pipe

200
True
父端接收0:[32, None, 'ni hao wa']
True
父端接收1:[32, None, 'ni hao wa']
True
父端接收2:[32, None, 'ni hao wa']

result

4.Manager


通过Manager可以简单的使用list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Barries,Value+Arrary等类型的高级接口

Manager()返回的manager对象控制了一个server进程,此进程包含的python对象可以被其他的进程通过proxies来访问。从而达到多进程间数据通信且安全

例:对list,dict的应用例子:

#!/usr/bin/python3
# -*- coding:utf-8 -*-
from multiprocessing import Process,Manager def fun(d,l,n):
d[2] = ''
d['e'] = 'e'
d[34] = None
l.append(n)
print(l) if __name__ == '__main__':
with Manager() as manager:
d = manager.dict()
l = manager.list()
join_list = []
for i in range(6):
p = Process(target=fun, args=(d,l,i))
p.start()
join_list.append(p)
for res in join_list:
res.join()
print(l)
print(d)

example

[5]
[5, 2]
[5, 2, 3]
[5, 2, 3, 0]
[5, 2, 3, 0, 4]
[5, 2, 3, 0, 4, 1]
[5, 2, 3, 0, 4, 1]
[5, 2, 3, 0, 4, 1]
[5, 2, 3, 0, 4, 1]
[5, 2, 3, 0, 4, 1]
[5, 2, 3, 0, 4, 1]
[5, 2, 3, 0, 4, 1]
{2: '', 'e': 'e', 34: None}

result

Manager的详细参考:https://www.aliyun.com/jiaocheng/490316.html

5.Pool 类(进程池)


当进程数过多时,用于限制进程数

异步:进程并行

同步:进程串行

方法:

apply_async(func,args,kwds,callback)

进程异步,并行(func:执行一个函数,args/ dwds:进程参数,callback:Foo执行结果返回到callback执行的函数中)

apply(func,args,kwds) 进程同步,串行
close() 关闭进程池
terminate() 结束工作进程,不在处理未完成的任务
join() 主进程阻塞,等待子进程执行完毕
from multiprocessing import Pool,freeze_support
import time def Foo(i):
time.sleep(1)
print('exec..')
return i+100 # 返回到Bar中 def Bar(arg):
print('来自Foo 的i :',arg) # 接收 Foo中 的返回值 if __name__ == '__main__':
freeze_support() # 仅在Windows上才导入此模块进程程序才不会出错,Linux上不用
pool = Pool(5) # 限制每次进行的进程数为 5
for i in range(10):
pool.apply_async(func=Foo, args=(i,),callback=Bar) # 进程异步 # callback 把前面func的放在Bar中打印
# pool.apply(func=Foo, args=(i,)) # 同步,串行 # 没有callback属性
print('结束。。')
pool.close() # 注意:join必须放在close()后面,否则将不会等待子进程打印结束,而直接结束
pool.join()

进程池

结束。。
exec..
exec..
exec..
exec..
exec..
来自Foo 的i : 104
来自Foo 的i : 102
来自Foo 的i : 103
来自Foo 的i : 100
来自Foo 的i : 101
exec..
exec..
exec..
exec..
exec..
来自Foo 的i : 105
来自Foo 的i : 106
来自Foo 的i : 107
来自Foo 的i : 108
来自Foo 的i : 109

异步结果

exec..
exec..
exec..
exec..
exec..
exec..
exec..
exec..
exec..
exec..
结束。。

同步结果

Python_多进程的更多相关文章

  1. Python_多进程_pool进程池

    多进程典型案例: 1.将子进程的进程名作为列表中的元素,在父进程中遍历(异步)执行 #coding: utf-8 from multiprocessing import Pool import os, ...

  2. python_并发编程——多进程的第二种启动方式

    1.多进程的第二种启动方式 import os from multiprocessing import Process # 创建一个自定义类,继承Process类 class MyProcess(Pr ...

  3. python_并发编程——多进程

    from multiprocessing import Process import os def func1(): print('子进程1',os.getpid()) #子进程:获取当前进程的进程号 ...

  4. python_多线程多进程

    多线程,适用于IO密集型任务 IO,input,output缩写,包括网路io(比如上传下载),磁盘io,(比如数据库读写),CPU操作不频繁 多进程,适用于CPU密集型任务 数据分析,算法,依赖CP ...

  5. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  6. 取代SharedPreferences的多进程解决方案

    Android的SharedPreferences用来存储一些键值对, 但是却不支持跨进程使用. 跨进程来用的话, 当然是放在数据库更可靠啦, 本文主要是给作者的新库PreferencesProvid ...

  7. python 多进程使用总结

    python中的多进程主要使用到 multiprocessing 这个库.这个库在使用 multiprocessing.Manager().Queue时会出问题,建议大家升级到高版本python,如2 ...

  8. Nginx深入详解之多进程网络模型

    一.进程模型        Nginx之所以为广大码农喜爱,除了其高性能外,还有其优雅的系统架构.与Memcached的经典多线程模型相比,Nginx是经典的多进程模型.Nginx启动后以daemon ...

  9. Python的多线程(threading)与多进程(multiprocessing )

    进程:程序的一次执行(程序载入内存,系统分配资源运行).每个进程有自己的内存空间,数据栈等,进程之间可以进行通讯,但是不能共享信息. 线程:所有的线程运行在同一个进程中,共享相同的运行环境.每个独立的 ...

随机推荐

  1. HBase轻松入门之HBase架构图解析

    2018-12-13 2018-12-20 本篇文章旨在针对初学者以我本人现阶段所掌握的知识就HBase的架构图中各模块作一个概念科普.不对文章内容的“绝对.完全正确性”负责. 1.开胃小菜 关于HB ...

  2. Android 6.0以上动态获取权限

    首先在清单文件中注册 然后在MainActivity.java中将权限封装到一个String数组中 static final String[] PERMISSION = new String[]{ M ...

  3. 协方差(Covariance)

    统计学上用方差和标准差来度量数据的离散程度 ,但是方差和标准差是用来描述一维数据的(或者说是多维数据的一个维度),现实生活中我们常常会碰到多维数据,因此人们发明了协方差(covariance),用来度 ...

  4. Mdoelsim10.4怎么脚本单独仿真ISE14.7 IP核

    软件版本: Modelsim10.4SE ISE14.7 仿真IP:时钟管理IP(clock wizard)   流程: 1.对于Modelsim10.4SE,并不自带Xilinx家的仿真库,因此首先 ...

  5. 【CF1151F】Sonya and Informatics(动态规划,矩阵快速幂)

    [CF1151F]Sonya and Informatics(动态规划,矩阵快速幂) 题面 CF 题解 考虑一个暴力\(dp\).假设有\(m\)个\(0\),\(n-m\)个\(1\).设\(f[i ...

  6. Product(欧拉函数)

    原题地址 先吐槽一波:凉心出题人又卡时间又卡空间 先来化简一波柿子 \[\prod_{i=1}^{n}\prod_{j=1}^{n}\frac{lcm(i,j)}{gcd(i,j)}\] \[=\pr ...

  7. Java多线程、线程池和线程安全整理

    多线程 1.1      多线程介绍 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 1.2      Thread类 通 ...

  8. function Language

    什么是函数式语言: 函数式语言(functional language)一类程序设计语言.是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型.这种语言具有较强的组织数据 ...

  9. 【SVN】svn 查看项目的 svn 服务器地址目录(脱机状态下)

    #事故现场: 在无法连接到svn服务器地址的情况下,查看本地项目的svn的服务器地址目录: #事故分析 因为无法连接svn服务器,所以只能通过svn在本地存储的信息来获取svn的地址路径信息: #解决 ...

  10. PHP循环语句深度理解分析——while, for, foreach, do while

    循环结构   一.while循环  while(表达式)  {   循环体;//反复执行,直到表达式为假  } 代码: $index = 1; while ($index<5) {        ...