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模块-多进程的更多相关文章

  1. python3 multiprocessing 模块

    多进程 Multiprocessing 模块 multiprocessing 模块官方说明文档 Process 类 Process 类用来描述一个进程对象.创建子进程的时候,只需要传入一个执行函数和函 ...

  2. 多进程 multiprocessing 模块进程并发Process;Pool ;Queue队列 、threading模块;

    multiprocessing 模块中的 Process类提供了跨平台的多进程功能,在windows和linux系统都可以使用. 1.首先要实例化一个类,传入要执行的函数. 实例名 = Process ...

  3. 使用multiprocessing模块创建多进程

    # 使用multiprocessing模块创建多进程 # multiprcessing模块提供了一个Process类来描述一个进程对象. # 创建子进程时,只需要传入一个执行函数和函数的参数,即可完成 ...

  4. 多进程Multiprocessing模块

    多进程 Multiprocessing 模块 先看看下面的几个方法: star() 方法启动进程, join() 方法实现进程间的同步,等待所有进程退出. close() 用来阻止多余的进程涌入进程池 ...

  5. python多进程multiprocessing模块中Queue的妙用

    最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个proc ...

  6. python之多进程multiprocessing模块

    process类介绍 multiprocessing 模块官方说明文档 Process 类用来描述一个进程对象.创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建 ...

  7. python 3 并发编程之多进程 multiprocessing模块

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

  8. 多进程编程——理论讲解与 multiprocessing 模块

    多进程编程 import os pid = os .fork() 功能 :创建新的进程 参数: 无 返回值 :失败返回一个负数 成功:在原有进程中返回新的进程的PID号 在新进程中返回为0* 子进程会 ...

  9. 进程,多进程,进程与程序的区别,程序运行的三种状态,multiprocessing模块中的Process功能,和join函数,和其他属性,僵尸与孤儿进程

    1.进程 什么是进程: 一个正在被运行的程序就称之为进程,是程序具体执行的过程,是一种抽象概念,进程来自操作系统 2.多进程  多个正在运行的程序 在python中实现多线程的方法 from mult ...

  10. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

随机推荐

  1. 完美解决报错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' 首先这个错误的意思是 前台页面 ...

  2. [apue] 一个工业级、跨平台的 tcp 网络服务框架:gevent

    作为公司的公共产品,经常有这样的需求:就是新建一个本地服务,产品线作为客户端通过 tcp 接入本地服务,来获取想要的业务能力. 与印象中动辄处理成千上万连接的 tcp 网络服务不同,这个本地服务是跑在 ...

  3. 【Hadoop】hdfs,剖析文件上传

    文件上传原理图 剖析文件写入 1.客户端(client)通过对DistributedFileSystem对象调用create()来新建文件: FSDataOutputStream outputStre ...

  4. Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)

    试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...

  5. (Java实现) 均分纸牌

    题目描述 有 N 堆纸牌,编号分别为 1,2,-, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 ...

  6. Java实现 LeetCode 682 棒球比赛(暴力)

    682. 棒球比赛 你现在是棒球比赛记录员. 给定一个字符串列表,每个字符串可以是以下四种类型之一: 1.整数(一轮的得分):直接表示您在本轮中获得的积分数. 2. "+"(一轮的 ...

  7. Java实现蓝桥杯 算法提高 身份证号码升级

    算法提高 身份证号码升级 时间限制:1.0s 内存限制:256.0MB 问题描述 从1999年10月1日开始,公民身份证号码由15位数字增至18位.(18位身份证号码简介).升级方法为: 1.把15位 ...

  8. Java实现 LeetCode 6 Z字形变换

    6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...

  9. jstat监控JVM内存使用、GC回收情况

    jstat -gcutil 2388 3000 6 每隔3秒打印一次pid为2388的堆内存的使用情况,共打印6次 S0— Heap上的 Survivor space 0 区已使用空间的百分比 S1  ...

  10. 详解SpringBoot(2.3)应用制作Docker镜像(官方方案)

    关于<SpringBoot-2.3容器化技术>系列 <SpringBoot-2.3容器化技术>系列,旨在和大家一起学习实践2.3版本带来的最新容器化技术,让咱们的Java应用更 ...