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 ...
随机推荐
- Beta冲刺 —— 总结随笔
这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.项目预期计划: 1.对于初版小程序的现 ...
- Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
887. 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...
- C# winform 学习(一)
目标 1.类和对象 2.定义类 3.对象的操作 4.命名空间 一.类和对象 1.理解 1)类:具有共同特征和行为的一类事物的统称 2)对象:类的一个具体唯一的实例 eg: 1路公交车;(类) 车牌为F ...
- java实现输入信用卡号码
/* 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心, 因为并不是一个随便的信用卡号码都是合法的,它必须通过 Luhn 算法来验证通过. 该校验的过程: 1.从卡号最后一 ...
- java实现 猜数字游戏
猜数字游戏 猜数字 很多人都玩过这个游戏:甲在心中想好一个数字,乙来猜.每猜一个数字,甲必须告诉他是猜大了,猜小了,还是刚好猜中了.下列的代码模拟了这个过程.其中用户充当甲的角色,计算机充当乙的角色. ...
- java实现第五届蓝桥杯海盗分金币
海盗分金币 有5个海盗,相约进行一次帆船比赛. 比赛中天气发生突变,他们被冲散了. 恰巧,他们都先后经过途中的一个无名的荒岛,并且每个人都信心满满,觉得自己是第一个经过该岛的人. 第一个人在沙滩上发现 ...
- java实现第六届蓝桥杯循环节长度
循环节长度 两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153..... 其循环节为[846153] 共有6位. 下面的方法,可以 ...
- Linux目录结构与功能
在Linux中,一切皆文件.所以,Linux和Windows目录有很大的不同,它没有明确的盘符,它的目录就像一棵大树一样,顶层目录就是根目录:/ ,然后下面又有很多个分支,分支可以再分,从而形成一个庞 ...
- list基本运用
#include<iostream> #include<list> using namespace std; list<int>list1,list2; void ...
- php symfony/var-dumper 打印插件
$records = array( array( 'id' => 2135, 'first_name' => 'John', 'last_name' => 'Doe', ), arr ...