Python3-multiprocessing模块-多进程
Python3中的multiprocessing模块是一个与threading模块类似,提供生成进程的API
多进程multiprocessing模块允许程序员充分利用给定机器上的多个CPU(处理器),但注意CPU是不认识进程的,进程更像是一个线程的容器,这也是为啥一个进程至少包含一个线程,但进程有两个缺点:
1.进程在同一时间只能干一件事,如果想同时干两件事或以上,进程就心有余而力不足了
2.进程在执行过程中如果被阻塞,比如等待输入,整个进程就会被挂起,无法做后面的操作
import os
import multiprocessing as mp def process_func(name):
print("进程ID,%s" % os.getpid())
print("父进程ID,%s" % os.getppid())
print("Hello,%s" % name)
print("--------------------------") if __name__ == "__main__":
p = mp.Process(target=process_func, args=("Jet", )) # 创建进程1
p2 = mp.Process(target=process_func, args=("Jack",)) # 创建进程2
p.start() # 启动进程1
p2.start() # 启动进程2
创建多进程实例
进程间的数据交互
不同进程的内存都是独享的,所以要想实现不同进程间的数据交互,主要有两种方式:
1.使用multiprocessing.Queue队列,特点是:FIFO(先进先出)同时它也是线程安全的
import multiprocessing as mp
"""
Queue进程间的互相通讯
特点: FIFO(先进先出) 线程安全
""" def process_func(q):
print("Hello,%s" % q.get()) # 取数据
print("Hello,%s" % q.get())
print("Hello,%s" % q.get()) if __name__ == "__main__":
que = mp.Queue()
que.put("Jet is 1") # 存数据
que.put("Jack is 2")
que.put("Judy is 3")
p = mp.Process(target=process_func, args=(que, )) # 创建进程
p.start() # 启动进程
2.使用multiprocessing.Pipe()管道函数,获取两个连接对象来进程通讯,特点是:双向收发
import multiprocessing as mp
"""
Pipes进程间的互相通讯
特点: 利用两个连接对象进行收发通讯
""" def process_func(conn):
print("Hello,%s" % conn.recv()) # 接收数据
print("Hello,%s" % conn.recv())
print("Hello,%s" % conn.recv())
conn.send("你好") # 发送数据
conn.close() if __name__ == "__main__":
front_conn, behind_conn = mp.Pipe()
front_conn.send("Jet is 1") # 发送数据
front_conn.send("Jack is 2")
front_conn.send("Judy is 3")
p = mp.Process(target=process_func, args=(behind_conn, )) # 创建进程
p.start() # 启动进程
p.join()
print(front_conn.recv()) # 接收数据
front_conn.close()
进程间的数据共享
能不能让不同的进程之间共享一份数据呢,答案是肯定的,不过就要使用Manager对象了,而且Manager是线程安全的
import multiprocessing as mp
"""
Manager进程间的数据共享
特点: 多个进程之间共享一些数据
""" def process_func(d, name ):
d[name] = name if __name__ == "__main__":
with mp.Manager() as mgr:
dt = mgr.dict()
p = mp.Process(target=process_func, args=(dt, "Jet")) # 创建进程
p1 = mp.Process(target=process_func, args=(dt, "Jack")) # 创建进程
p1.start()
p.start() # 启动进程
p.join()
p1.join()
print(dt)
进程同步
如果多个进程的目标为同一个对象时,比如多个进程都要向屏幕输出,那么此时,就要让这些进程变成串行的,怎么办?加锁!
import os
import time
import multiprocessing as mp def process_func(l, name):
try:
l.acquire()
print("进程ID,%s" % os.getpid())
print("父进程ID,%s" % os.getppid())
print("Hello,%s" % name)
print("--------------------------")
time.sleep(2)
finally:
l.release() if __name__ == "__main__":
lock = mp.Lock()
p = mp.Process(target=process_func, args=(lock, "Jet", )) # 创建进程1
p2 = mp.Process(target=process_func, args=(lock, "Jack",)) # 创建进程2
p.start() # 启动进程1
p2.start() # 启动进程2
进程池
进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止
from multiprocessing import Process, Pool
import time def process_func(i):
time.sleep(1)
print(i)
return i + 100 def callback_func(arg):
print('-->exec done:', arg) if __name__ == "__main__":
pool = Pool(3)
for i in range(10):
pool.apply_async(func=process_func, args=(i,), callback=callback_func) # 异步调用
# pool.apply(func=Foo, args=(i,)) # 同步调用 print('end')
pool.close()
pool.join() # 进程池中的进程执行玩在关闭,先close()在 join()
参考资料
http://www.cnblogs.com/alex3714/articles/5230609.html
http://python.usyiyi.cn/translate/python_352/library/multiprocessing.html
Python3-multiprocessing模块-多进程的更多相关文章
- python3 multiprocessing 模块
多进程 Multiprocessing 模块 multiprocessing 模块官方说明文档 Process 类 Process 类用来描述一个进程对象.创建子进程的时候,只需要传入一个执行函数和函 ...
- 多进程 multiprocessing 模块进程并发Process;Pool ;Queue队列 、threading模块;
multiprocessing 模块中的 Process类提供了跨平台的多进程功能,在windows和linux系统都可以使用. 1.首先要实例化一个类,传入要执行的函数. 实例名 = Process ...
- 使用multiprocessing模块创建多进程
# 使用multiprocessing模块创建多进程 # multiprcessing模块提供了一个Process类来描述一个进程对象. # 创建子进程时,只需要传入一个执行函数和函数的参数,即可完成 ...
- 多进程Multiprocessing模块
多进程 Multiprocessing 模块 先看看下面的几个方法: star() 方法启动进程, join() 方法实现进程间的同步,等待所有进程退出. close() 用来阻止多余的进程涌入进程池 ...
- python多进程multiprocessing模块中Queue的妙用
最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个proc ...
- python之多进程multiprocessing模块
process类介绍 multiprocessing 模块官方说明文档 Process 类用来描述一个进程对象.创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建 ...
- python 3 并发编程之多进程 multiprocessing模块
一 .multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...
- 多进程编程——理论讲解与 multiprocessing 模块
多进程编程 import os pid = os .fork() 功能 :创建新的进程 参数: 无 返回值 :失败返回一个负数 成功:在原有进程中返回新的进程的PID号 在新进程中返回为0* 子进程会 ...
- 进程,多进程,进程与程序的区别,程序运行的三种状态,multiprocessing模块中的Process功能,和join函数,和其他属性,僵尸与孤儿进程
1.进程 什么是进程: 一个正在被运行的程序就称之为进程,是程序具体执行的过程,是一种抽象概念,进程来自操作系统 2.多进程 多个正在运行的程序 在python中实现多线程的方法 from mult ...
- Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块
Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fab ...
随机推荐
- 完美解决报错Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'
Failed to convert value of type 'java.lang.String' to required type 'java.util.Date' 首先这个错误的意思是 前台页面 ...
- [apue] 一个工业级、跨平台的 tcp 网络服务框架:gevent
作为公司的公共产品,经常有这样的需求:就是新建一个本地服务,产品线作为客户端通过 tcp 接入本地服务,来获取想要的业务能力. 与印象中动辄处理成千上万连接的 tcp 网络服务不同,这个本地服务是跑在 ...
- 【Hadoop】hdfs,剖析文件上传
文件上传原理图 剖析文件写入 1.客户端(client)通过对DistributedFileSystem对象调用create()来新建文件: FSDataOutputStream outputStre ...
- Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...
- (Java实现) 均分纸牌
题目描述 有 N 堆纸牌,编号分别为 1,2,-, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 ...
- Java实现 LeetCode 682 棒球比赛(暴力)
682. 棒球比赛 你现在是棒球比赛记录员. 给定一个字符串列表,每个字符串可以是以下四种类型之一: 1.整数(一轮的得分):直接表示您在本轮中获得的积分数. 2. "+"(一轮的 ...
- Java实现蓝桥杯 算法提高 身份证号码升级
算法提高 身份证号码升级 时间限制:1.0s 内存限制:256.0MB 问题描述 从1999年10月1日开始,公民身份证号码由15位数字增至18位.(18位身份证号码简介).升级方法为: 1.把15位 ...
- Java实现 LeetCode 6 Z字形变换
6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...
- jstat监控JVM内存使用、GC回收情况
jstat -gcutil 2388 3000 6 每隔3秒打印一次pid为2388的堆内存的使用情况,共打印6次 S0— Heap上的 Survivor space 0 区已使用空间的百分比 S1 ...
- 详解SpringBoot(2.3)应用制作Docker镜像(官方方案)
关于<SpringBoot-2.3容器化技术>系列 <SpringBoot-2.3容器化技术>系列,旨在和大家一起学习实践2.3版本带来的最新容器化技术,让咱们的Java应用更 ...